From jboss-envers-commits at lists.jboss.org Thu Aug 14 05:12:11 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 14 Aug 2008 05:12:11 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r98 - trunk/src/main/org/jboss/envers/query/impl. Message-ID: Author: adamw Date: 2008-08-14 05:12:11 -0400 (Thu, 14 Aug 2008) New Revision: 98 Modified: trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java Log: ENVERS-35: only non-deleted entities are selected Modified: trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-07-29 08:44:59 UTC (rev 97) +++ trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-14 09:12:11 UTC (rev 98) @@ -23,6 +23,7 @@ import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.query.criteria.VersionsCriterion; +import org.jboss.envers.RevisionType; import org.hibernate.criterion.*; import java.util.List; @@ -45,6 +46,7 @@ The query that should be executed in the versions table: SELECT e FROM ent_ver e WHERE (all specified conditions, transformed, on the "e" entity) AND + e.revision_type != DEL AND e.revision = (SELECT max(e2.revision) FROM ent_ver e2 WHERE e2.revision <= :revision AND e2.originalId.id = e.originalId.id) */ @@ -62,6 +64,8 @@ maxRevCriteria.add(versionsReader.getVerCfg().getIdMapper(entityName).getIdsEqualCriterion( "e." + originalIdPropertyName, "e2." + originalIdPropertyName)); + // e.revision_type != DEL AND + versionsCriteria.add(Property.forName(versionsReader.getEntitiesCfg().getRevisionTypePropName()).ne(RevisionType.DEL)); // e.revision = (SELECT max(...) ...) versionsCriteria.add(Property.forName(revisionPropertyPath).eq(maxRevCriteria)); // all specified conditions, transformed From jboss-envers-commits at lists.jboss.org Thu Aug 14 05:36:39 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 14 Aug 2008 05:36:39 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r99 - trunk/src/test/org/jboss/envers/test/integration/query. Message-ID: Author: adamw Date: 2008-08-14 05:36:38 -0400 (Thu, 14 Aug 2008) New Revision: 99 Added: trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java Log: ENVERS-35: test Added: trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java 2008-08-14 09:36:38 UTC (rev 99) @@ -0,0 +1,69 @@ +package org.jboss.envers.test.integration.query; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.StrIntTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.query.RevisionProperty; +import org.jboss.envers.query.RevisionTypeProperty; +import org.jboss.envers.RevisionType; +import org.hibernate.ejb.Ejb3Configuration; +import org.hibernate.criterion.Projections; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.List; +import java.util.HashSet; +import java.util.Arrays; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DeletedEntities extends AbstractEntityTest { + private Integer id1; + private Integer id2; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrIntTestEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + // Revision 1 + EntityManager em = getEntityManager(); + em.getTransaction().begin(); + + StrIntTestEntity site1 = new StrIntTestEntity("a", 10); + StrIntTestEntity site2 = new StrIntTestEntity("b", 11); + + em.persist(site1); + em.persist(site2); + + id1 = site1.getId(); + id2 = site2.getId(); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + site2 = em.find(StrIntTestEntity.class, id2); + em.remove(site2); + + em.getTransaction().commit(); + } + + @Test + public void testProjectionsInEntitiesAtRevision() { + assert getVersionsReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 1) + .getResultList().size() == 2; + assert getVersionsReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 2) + .getResultList().size() == 1; + + assert (Integer) getVersionsReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 1) + .setProjection(Projections.count("originalId.id")).getResultList().get(0) == 2; + assert (Integer) getVersionsReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 2) + .setProjection(Projections.count("originalId.id")).getResultList().get(0) == 1; + } +} From jboss-envers-commits at lists.jboss.org Thu Aug 14 06:02:22 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 14 Aug 2008 06:02:22 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r100 - in trunk/src: main/org/jboss/envers/query and 4 other directories. Message-ID: Author: adamw Date: 2008-08-14 06:02:22 -0400 (Thu, 14 Aug 2008) New Revision: 100 Modified: trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java trunk/src/test/org/jboss/envers/test/integration/query/MaximalizePropertyQuery.java trunk/src/test/org/jboss/envers/test/integration/query/RevisionConstraintQuery.java trunk/src/test/org/jboss/envers/test/integration/query/SimpleQuery.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java trunk/src/test/org/jboss/envers/test/working/WorkingMain.java Log: ENVERS-36: an additonal parametr for the revisions of entity query, stating if deleted entities should be selected, and tests Modified: trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java =================================================================== --- trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-14 10:02:22 UTC (rev 100) @@ -21,7 +21,6 @@ */ package org.jboss.envers.entity; -import org.jboss.envers.RevisionType; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.mapper.id.IdMapper; @@ -56,11 +55,6 @@ if (versionsEntity == null) { return null; } - - if (RevisionType.DEL.equals(versionsEntity.get(verCfg.getEntitiesCfg().getRevisionTypePropName()))) { - // This means that at the given revision the entity didn't yet exist. - return null; - } // The $type$ property holds the name of the (versions) entity String type = verCfg.getEntityNameForVersionsEntityName((String) versionsEntity.get("$type$")); Modified: trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java =================================================================== --- trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-14 10:02:22 UTC (rev 100) @@ -59,12 +59,14 @@ * @param c Class of the entities for which to query. * @param selectEntitiesOnly If true, instead of a list of three-element arrays, a list of entites will be * returned as a result of executing this query. + * @param selectDeletedEntities If true, also revisions where entities where deleted will be returned. The + * entities will have revision type "delete", and contain no data (all fields null), except for the id field. * @return A query for revisions at which instances of the given entity were modified, to which * conditions can be added (for example - a specific id of an entity of class c), and which * can then be executed. The results of the query will be sorted in ascending order by the revision number, * unless an order or projection is added. */ - public VersionsQuery forRevisionsOfEntity(Class c, boolean selectEntitiesOnly) { - return new RevisionsOfEntityQuery(versionsReaderImplementor, c, selectEntitiesOnly); + public VersionsQuery forRevisionsOfEntity(Class c, boolean selectEntitiesOnly, boolean selectDeletedEntities) { + return new RevisionsOfEntityQuery(versionsReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities); } } Modified: trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-14 10:02:22 UTC (rev 100) @@ -26,6 +26,7 @@ import org.jboss.envers.query.criteria.VersionsCriterion; import org.jboss.envers.RevisionType; import org.hibernate.criterion.Order; +import org.hibernate.criterion.Property; import java.util.List; import java.util.ArrayList; @@ -35,12 +36,15 @@ * @author Adam Warski (adam at warski dot org) */ public class RevisionsOfEntityQuery extends AbstractVersionsQuery { - private boolean selectEntitiesOnly; + private final boolean selectEntitiesOnly; + private final boolean selectDeletedEntities; - public RevisionsOfEntityQuery(VersionsReaderImplementor versionsReader, Class cls, boolean selectEntitiesOnly) { + public RevisionsOfEntityQuery(VersionsReaderImplementor versionsReader, Class cls, boolean selectEntitiesOnly, + boolean selectDeletedEntities) { super(versionsReader, cls); this.selectEntitiesOnly = selectEntitiesOnly; + this.selectDeletedEntities = selectDeletedEntities; } @SuppressWarnings({"unchecked"}) @@ -48,11 +52,17 @@ /* The query that should be executed in the versions table: SELECT e (unless another projection is specified) FROM ent_ver e WHERE + e.revision_type != DEL AND (if selectDeletedEntities == false) (all specified conditions, transformed, on the "e" entity) ORDER BY e.revision ASC (unless another order is specified) */ String revisionPropertyPath = versionsReader.getEntitiesCfg().getRevisionPropPath(); + if (!selectDeletedEntities) { + // e.revision_type != DEL AND + versionsCriteria.add(Property.forName(versionsReader.getEntitiesCfg().getRevisionTypePropName()).ne(RevisionType.DEL)); + } + // all specified conditions, transformed for (VersionsCriterion criterion : criterions) { versionsCriteria.add(criterion.toVersionsCriterion(entityName, versionsReader)); Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-14 10:02:22 UTC (rev 100) @@ -154,7 +154,7 @@ throw new NotVersionedException(entityName + " is not versioned!"); } - return createQuery().forRevisionsOfEntity(cls, false) + return createQuery().forRevisionsOfEntity(cls, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(VersionsRestrictions.idEq(primaryKey)) .getResultList(); Modified: trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java 2008-08-14 10:02:22 UTC (rev 100) @@ -66,4 +66,18 @@ assert (Integer) getVersionsReader().createQuery().forEntitiesAtRevision(StrIntTestEntity.class, 2) .setProjection(Projections.count("originalId.id")).getResultList().get(0) == 1; } + + @Test + public void testRevisionsOfEntityWithoutDelete() { + List result = getVersionsReader().createQuery() + .forRevisionsOfEntity(StrIntTestEntity.class, false, false) + .add(VersionsRestrictions.idEq(id2)) + .getResultList(); + + assert result.size() == 1; + + assert ((Object []) result.get(0))[0].equals(new StrIntTestEntity("b", 11, id2)); + assert ((Object []) result.get(0))[1].equals(1); + assert ((Object []) result.get(0))[2].equals(RevisionType.ADD); + } } Modified: trunk/src/test/org/jboss/envers/test/integration/query/MaximalizePropertyQuery.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/query/MaximalizePropertyQuery.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/test/org/jboss/envers/test/integration/query/MaximalizePropertyQuery.java 2008-08-14 10:02:22 UTC (rev 100) @@ -78,7 +78,7 @@ @Test public void testMaximizeWithIdEq() { List revs_id1 = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(VersionsRestrictions.maximizeProperty("number") .add(VersionsRestrictions.idEq(id2))) @@ -90,7 +90,7 @@ @Test public void testMinimizeWithPropertyEq() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(VersionsRestrictions.minimizeProperty("number") .add(VersionsRestrictions.eq("str1", "a"))) Modified: trunk/src/test/org/jboss/envers/test/integration/query/RevisionConstraintQuery.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/query/RevisionConstraintQuery.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/test/org/jboss/envers/test/integration/query/RevisionConstraintQuery.java 2008-08-14 10:02:22 UTC (rev 100) @@ -78,7 +78,7 @@ @Test public void testRevisionsLtQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(VersionsProjections.distinct(RevisionProperty.revisionNumber())) .add(RevisionProperty.lt(3)) .getResultList(); @@ -89,7 +89,7 @@ @Test public void testRevisionsGeQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(VersionsProjections.distinct(RevisionProperty.revisionNumber())) .add(RevisionProperty.ge(2)) .getResultList(); @@ -100,7 +100,7 @@ @Test public void testRevisionsLeWithPropertyQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(RevisionProperty.le(3)) .add(VersionsRestrictions.eq("str1", "a")) @@ -112,7 +112,7 @@ @Test public void testRevisionsGtWithPropertyQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(RevisionProperty.gt(1)) .add(VersionsRestrictions.lt("number", 10)) @@ -124,7 +124,7 @@ @Test public void testRevisionProjectionQuery() { Object[] result = (Object[]) getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection( VersionsProjections.projectionList() .add(RevisionProperty.max()) @@ -141,7 +141,7 @@ @Test public void testRevisionOrderQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(VersionsRestrictions.idEq(id1)) .addOrder(RevisionProperty.desc()) @@ -154,7 +154,7 @@ public void testRevisionCountQuery() { // The query shouldn't be ordered as always, otherwise - we get an exception. Object result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.count()) .add(VersionsRestrictions.idEq(id1)) .getSingleResult(); Modified: trunk/src/test/org/jboss/envers/test/integration/query/SimpleQuery.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/query/SimpleQuery.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/test/org/jboss/envers/test/integration/query/SimpleQuery.java 2008-08-14 10:02:22 UTC (rev 100) @@ -141,21 +141,21 @@ @Test public void testRevisionsPropertyEqQuery() { List revs_id1 = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(VersionsRestrictions.le("str1", "a")) .add(VersionsRestrictions.idEq(id1)) .getResultList(); List revs_id2 = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(VersionsRestrictions.le("str1", "a")) .add(VersionsRestrictions.idEq(id2)) .getResultList(); List revs_id3 = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionProperty.revisionNumber()) .add(VersionsRestrictions.le("str1", "a")) .add(VersionsRestrictions.idEq(id3)) @@ -169,10 +169,12 @@ @Test public void testSelectEntitiesQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, true) + .forRevisionsOfEntity(StrIntTestEntity.class, true, false) .add(VersionsRestrictions.idEq(id1)) .getResultList(); + assert result.size() == 2; + assert result.get(0).equals(new StrIntTestEntity("a", 10, id1)); assert result.get(1).equals(new StrIntTestEntity("c", 10, id1)); } @@ -180,13 +182,15 @@ @Test public void testSelectEntitiesAndRevisionsQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .add(VersionsRestrictions.idEq(id1)) .getResultList(); + assert result.size() == 3; + assert ((Object []) result.get(0))[0].equals(new StrIntTestEntity("a", 10, id1)); assert ((Object []) result.get(1))[0].equals(new StrIntTestEntity("c", 10, id1)); - assert ((Object []) result.get(2))[0] == null; + assert ((Object []) result.get(2))[0].equals(new StrIntTestEntity(null, null, id1)); assert ((Object []) result.get(0))[1].equals(1); assert ((Object []) result.get(1))[1].equals(2); @@ -200,11 +204,13 @@ @Test public void testSelectRevisionTypeQuery() { List result = getVersionsReader().createQuery() - .forRevisionsOfEntity(StrIntTestEntity.class, false) + .forRevisionsOfEntity(StrIntTestEntity.class, false, true) .setProjection(RevisionTypeProperty.revisionType()) .add(VersionsRestrictions.idEq(id1)) .getResultList(); + assert result.size() == 3; + assert result.get(0).equals(RevisionType.ADD); assert result.get(1).equals(RevisionType.MOD); assert result.get(2).equals(RevisionType.DEL); Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-14 10:02:22 UTC (rev 100) @@ -5,6 +5,7 @@ import javax.persistence.*; import java.util.Set; +import java.util.List; /** * @author Adam Warski (adam at warski dot org) @@ -21,7 +22,7 @@ private String str2; @Versioned - @OneToMany(mappedBy = "we2") + @OneToMany(mappedBy="we2") //@ManyToMany //@Transient private Set we1s; Modified: trunk/src/test/org/jboss/envers/test/working/WorkingMain.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-14 09:36:38 UTC (rev 99) +++ trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-14 10:02:22 UTC (rev 100) @@ -7,6 +7,7 @@ import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Property; import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.Projections; import org.jboss.envers.VersionsReader; import org.jboss.envers.VersionsReaderFactory; import org.jboss.envers.test.entities.ids.EmbId; @@ -16,6 +17,8 @@ import org.jboss.envers.test.integration.inheritance.single.relation.ParentIngEntity; import org.jboss.envers.test.integration.inheritance.single.relation.ChildIngEntity; import org.jboss.envers.query.criteria.VersionsCriterion; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.query.VersionsProjections; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; @@ -57,9 +60,43 @@ // Rev 1 entityManager.getTransaction().begin(); + WorkingEntity2 we2 = new WorkingEntity2("s"); + entityManager.persist(we2); + WorkingEntity1 we1 = new WorkingEntity1("b", "c"); + we1.setWe2(we2); + entityManager.persist(we1); - entityManager.getTransaction().commit(); + WorkingEntity1 we1_2 = new WorkingEntity1("b2", "c2"); + we1_2.setWe2(we2); + entityManager.persist(we1_2); + + entityManager.getTransaction().commit(); + + // Rev 2 + entityManager.getTransaction().begin(); + + we1 = entityManager.find(WorkingEntity1.class, we1.getId1()); + entityManager.remove(we1); + + entityManager.getTransaction().commit(); + + // Rev 3 + entityManager.getTransaction().begin(); + + VersionsReader vr = VersionsReaderFactory.get(entityManager); + + System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 1) + .getResultList()); + System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 1) + .setProjection(Projections.count("originalId.id1")).getResultList()); + + System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 2) + .getResultList()); + System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 2) + .setProjection(Projections.count("originalId.id1")).getResultList()); + + entityManager.getTransaction().commit(); } } From jboss-envers-commits at lists.jboss.org Thu Aug 14 06:11:22 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 14 Aug 2008 06:11:22 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r101 - in trunk/src/main/org/jboss/envers: tools and 2 other directories. Message-ID: Author: adamw Date: 2008-08-14 06:11:22 -0400 (Thu, 14 Aug 2008) New Revision: 101 Added: trunk/src/main/org/jboss/envers/tools/log/ trunk/src/main/org/jboss/envers/tools/reflection/ Removed: trunk/src/main/org/jboss/envers/log/ trunk/src/main/org/jboss/envers/reflection/ Modified: trunk/src/main/org/jboss/envers/tools/log/YLog.java trunk/src/main/org/jboss/envers/tools/log/YLogManager.java trunk/src/main/org/jboss/envers/tools/reflection/ReflectionTools.java trunk/src/main/org/jboss/envers/tools/reflection/YClass.java trunk/src/main/org/jboss/envers/tools/reflection/YMethodsAndClasses.java trunk/src/main/org/jboss/envers/tools/reflection/YProperty.java trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java Log: ENVERS-37: moving reflection and log facades to tools Copied: trunk/src/main/org/jboss/envers/tools/log (from rev 95, trunk/src/main/org/jboss/envers/log) Modified: trunk/src/main/org/jboss/envers/tools/log/YLog.java =================================================================== --- trunk/src/main/org/jboss/envers/log/YLog.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/tools/log/YLog.java 2008-08-14 10:11:22 UTC (rev 101) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.log; +package org.jboss.envers.tools.log; import org.jboss.envers.exception.VersionsException; Modified: trunk/src/main/org/jboss/envers/tools/log/YLogManager.java =================================================================== --- trunk/src/main/org/jboss/envers/log/YLogManager.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/tools/log/YLogManager.java 2008-08-14 10:11:22 UTC (rev 101) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.log; +package org.jboss.envers.tools.log; import org.jboss.envers.exception.VersionsException; Copied: trunk/src/main/org/jboss/envers/tools/reflection (from rev 95, trunk/src/main/org/jboss/envers/reflection) Modified: trunk/src/main/org/jboss/envers/tools/reflection/ReflectionTools.java =================================================================== --- trunk/src/main/org/jboss/envers/reflection/ReflectionTools.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/tools/reflection/ReflectionTools.java 2008-08-14 10:11:22 UTC (rev 101) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reflection; +package org.jboss.envers.tools.reflection; import org.hibernate.property.PropertyAccessor; import org.hibernate.property.BasicPropertyAccessor; Modified: trunk/src/main/org/jboss/envers/tools/reflection/YClass.java =================================================================== --- trunk/src/main/org/jboss/envers/reflection/YClass.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/tools/reflection/YClass.java 2008-08-14 10:11:22 UTC (rev 101) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reflection; +package org.jboss.envers.tools.reflection; import org.jboss.envers.exception.VersionsException; Modified: trunk/src/main/org/jboss/envers/tools/reflection/YMethodsAndClasses.java =================================================================== --- trunk/src/main/org/jboss/envers/reflection/YMethodsAndClasses.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/tools/reflection/YMethodsAndClasses.java 2008-08-14 10:11:22 UTC (rev 101) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reflection; +package org.jboss.envers.tools.reflection; import org.jboss.envers.exception.VersionsException; Modified: trunk/src/main/org/jboss/envers/tools/reflection/YProperty.java =================================================================== --- trunk/src/main/org/jboss/envers/reflection/YProperty.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/tools/reflection/YProperty.java 2008-08-14 10:11:22 UTC (rev 101) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reflection; +package org.jboss.envers.tools.reflection; import org.jboss.envers.exception.VersionsException; Modified: trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java =================================================================== --- trunk/src/main/org/jboss/envers/reflection/YReflectionManager.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java 2008-08-14 10:11:22 UTC (rev 101) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reflection; +package org.jboss.envers.tools.reflection; import org.hibernate.cfg.Configuration; import org.jboss.envers.exception.VersionsException; From jboss-envers-commits at lists.jboss.org Thu Aug 14 06:19:45 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 14 Aug 2008 06:19:45 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r102 - in trunk/src/main/org/jboss/envers: entity and 4 other directories. Message-ID: Author: adamw Date: 2008-08-14 06:19:45 -0400 (Thu, 14 Aug 2008) New Revision: 102 Modified: trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java trunk/src/main/org/jboss/envers/mapper/MapPropertyMapper.java trunk/src/main/org/jboss/envers/mapper/MultiPropertyMapper.java trunk/src/main/org/jboss/envers/mapper/SinglePropertyMapper.java trunk/src/main/org/jboss/envers/mapper/id/EmbeddedIdMapper.java trunk/src/main/org/jboss/envers/mapper/id/SingleIdMapper.java trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java trunk/src/main/org/jboss/envers/metadata/AnnotationsMetadataReader.java trunk/src/main/org/jboss/envers/metadata/VersionsMetadataGenerator.java Log: ENVERS-37: moving reflection and log facades to tools Modified: trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java 2008-08-14 10:19:45 UTC (rev 102) @@ -22,7 +22,7 @@ package org.jboss.envers.configuration; import org.jboss.envers.RevisionListener; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.hibernate.MappingException; import org.hibernate.property.Setter; Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-14 10:19:45 UTC (rev 102) @@ -32,7 +32,7 @@ import org.jboss.envers.mapper.ExtendedPropertyMapper; import org.jboss.envers.mapper.id.IdMapper; import org.jboss.envers.tools.graph.GraphTopologicalSort; -import org.jboss.envers.reflection.YReflectionManager; +import org.jboss.envers.tools.reflection.YReflectionManager; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.XMLWriter; Modified: trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-14 10:19:45 UTC (rev 102) @@ -27,9 +27,9 @@ import org.jboss.envers.RevisionEntity; import org.jboss.envers.RevisionNumber; import org.jboss.envers.RevisionTimestamp; -import org.jboss.envers.reflection.YReflectionManager; -import org.jboss.envers.reflection.YClass; -import org.jboss.envers.reflection.YProperty; +import org.jboss.envers.tools.reflection.YReflectionManager; +import org.jboss.envers.tools.reflection.YClass; +import org.jboss.envers.tools.reflection.YProperty; import org.jboss.envers.tools.MutableBoolean; import java.util.*; Modified: trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java =================================================================== --- trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-14 10:19:45 UTC (rev 102) @@ -25,7 +25,7 @@ import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.mapper.id.IdMapper; import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import java.util.Map; import java.util.List; Modified: trunk/src/main/org/jboss/envers/mapper/MapPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/MapPropertyMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/MapPropertyMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -22,7 +22,7 @@ package org.jboss.envers.mapper; import org.jboss.envers.ModificationStore; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; import org.hibernate.property.Getter; Modified: trunk/src/main/org/jboss/envers/mapper/MultiPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/MultiPropertyMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/MultiPropertyMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -24,7 +24,7 @@ import org.hibernate.property.Getter; import org.hibernate.MappingException; import org.jboss.envers.ModificationStore; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import java.util.Map; Modified: trunk/src/main/org/jboss/envers/mapper/SinglePropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/SinglePropertyMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/SinglePropertyMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -22,7 +22,7 @@ package org.jboss.envers.mapper; import org.jboss.envers.ModificationStore; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.tools.Tools; import org.jboss.envers.exception.VersionsException; Modified: trunk/src/main/org/jboss/envers/mapper/id/EmbeddedIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/EmbeddedIdMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/id/EmbeddedIdMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -25,7 +25,7 @@ import org.hibernate.property.Setter; import org.hibernate.util.ReflectHelper; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import java.util.Map; import java.util.Set; Modified: trunk/src/main/org/jboss/envers/mapper/id/SingleIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/SingleIdMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/id/SingleIdMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -22,7 +22,7 @@ package org.jboss.envers.mapper.id; import org.jboss.envers.ModificationStore; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.exception.VersionsException; import org.hibernate.property.Setter; import org.hibernate.property.Getter; Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -27,7 +27,7 @@ import org.jboss.envers.reader.lazy.proxy.ListProxy; import org.jboss.envers.reader.lazy.proxy.SetProxy; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.hibernate.property.Setter; import org.hibernate.property.Getter; Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -23,7 +23,7 @@ import org.jboss.envers.mapper.PropertyMapper; import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.hibernate.property.Setter; import java.util.Map; Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java 2008-08-14 10:19:45 UTC (rev 102) @@ -24,7 +24,7 @@ import org.jboss.envers.mapper.PropertyMapper; import org.jboss.envers.mapper.id.IdMapper; import org.jboss.envers.tools.Tools; -import org.jboss.envers.reflection.ReflectionTools; +import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.reader.lazy.ToOneDelegateSessionImplementor; import org.hibernate.property.Setter; Modified: trunk/src/main/org/jboss/envers/metadata/AnnotationsMetadataReader.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/AnnotationsMetadataReader.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/metadata/AnnotationsMetadataReader.java 2008-08-14 10:19:45 UTC (rev 102) @@ -21,9 +21,9 @@ */ package org.jboss.envers.metadata; -import org.jboss.envers.reflection.YClass; -import org.jboss.envers.reflection.YProperty; -import org.jboss.envers.reflection.YReflectionManager; +import org.jboss.envers.tools.reflection.YClass; +import org.jboss.envers.tools.reflection.YProperty; +import org.jboss.envers.tools.reflection.YReflectionManager; import org.jboss.envers.metadata.data.PersistentClassVersioningData; import org.jboss.envers.Versioned; import org.jboss.envers.VersionsTable; Modified: trunk/src/main/org/jboss/envers/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/VersionsMetadataGenerator.java 2008-08-14 10:11:22 UTC (rev 101) +++ trunk/src/main/org/jboss/envers/metadata/VersionsMetadataGenerator.java 2008-08-14 10:19:45 UTC (rev 102) @@ -42,8 +42,8 @@ import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.HibernateVersion; import org.jboss.envers.ModificationStore; -import org.jboss.envers.log.YLog; -import org.jboss.envers.log.YLogManager; +import org.jboss.envers.tools.log.YLog; +import org.jboss.envers.tools.log.YLogManager; import org.jboss.envers.metadata.data.IdMappingData; import org.jboss.envers.metadata.data.PersistentClassVersioningData; import org.jboss.envers.metadata.data.PropertyStoreInfo; @@ -223,7 +223,7 @@ } @SuppressWarnings({"unchecked"}) - private void addOneToOne(Property property, CompositeMapperBuilder mapper, String entityName) { + private void addOneToOneBidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { OneToOne propertyValue = (OneToOne) property.getValue(); String owningReferencePropertyName = propertyValue.getReferencedPropertyName(); // mappedBy @@ -273,7 +273,7 @@ } @SuppressWarnings({"unchecked"}) - private void addOneToMany(Property property, CompositeMapperBuilder mapper, String entityName) { + private void addOneToManyBidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { Collection propertyValue = (Collection) property.getValue(); String owningReferencePropertyName = getMappedBy(propertyValue); @@ -304,6 +304,35 @@ propertyName)); } + @SuppressWarnings({"unchecked"}) + private void addOneToManyUnidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { + Collection propertyValue = (Collection) property.getValue(); + ManyToOne mto = (ManyToOne) propertyValue.getElement(); + + String referencedEntityName = mto.getReferencedEntityName(); + + EntityConfiguration configuration = entitiesConfigurations.get(entityName); + if (configuration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); + } + + EntityConfiguration referencedConfiguration = entitiesConfigurations.get(referencedEntityName); + if (referencedConfiguration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + referencedEntityName + "!"); + } + + IdMappingData referencingIdMapping = configuration.getIdMappingData(); + IdMappingData referencedIdMapping = referencedConfiguration.getIdMappingData(); + + // Name of the entity that will be used to store the relation between the two entities. + String middleEntityName = entityName + "_" + referencedEntityName; + + MetadataTools.createEntity(null, middleEntityName, mto.getTable().getName(), mto.getTable().getSchema(), + mto.getTable().getCatalog(), null); + + // TODO: ??? + } + private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo) { /* * Checks if a property is versioned, which is when: @@ -369,7 +398,7 @@ } else if (propertyType instanceof OneToOneType) { // only second pass if (!firstPass) { - addOneToOne(property, currentMapper, entityName); + addOneToOneBidirectional(property, currentMapper, entityName); } } else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals( propertyType.getClass().getName())) { @@ -388,8 +417,14 @@ ((((Collection) property.getValue()).getElement() instanceof OneToMany))) { // only second pass if (!firstPass) { - addOneToMany(property, currentMapper, entityName); + addOneToManyBidirectional(property, currentMapper, entityName); } + } else if ((propertyType instanceof BagType || propertyType instanceof SetType) && + ((((Collection) property.getValue()).getElement() instanceof ManyToOne))) { + // only second pass + if (!firstPass) { + addOneToManyUnidirectional(property, currentMapper, entityName); + } } else { String message = "Type not supported for versioning: " + propertyType.getClass().getName() + ", on entity " + entityName + ", property '" + property.getName() + "'."; @@ -457,9 +492,9 @@ @SuppressWarnings({"unchecked"}) private IdMappingData addId(PersistentClass pc) { - // Mapping which will be used for relations + // Xml mapping which will be used for relations Element rel_id_mapping = new DefaultElement("properties"); - // Mapping which will be used for the primary key of the versions table + // Xml mapping which will be used for the primary key of the versions table Element orig_id_mapping = new DefaultElement("composite-id"); Property id_prop = pc.getIdentifierProperty(); @@ -491,7 +526,6 @@ orig_id_mapping.addAttribute("name", verEntCfg.getOriginalIdPropName()); - // Adding the "revision number" property Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verEntCfg.getRevisionPropName(), verEntCfg.getRevisionPropType(), true); From jboss-envers-commits at lists.jboss.org Thu Aug 14 07:12:23 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 14 Aug 2008 07:12:23 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r103 - in trunk/src/main/org/jboss/envers: configuration and 3 other directories. Message-ID: Author: adamw Date: 2008-08-14 07:12:23 -0400 (Thu, 14 Aug 2008) New Revision: 103 Added: trunk/src/main/org/jboss/envers/configuration/metadata/ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java trunk/src/main/org/jboss/envers/configuration/metadata/InheritanceType.java trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/configuration/metadata/data/ Removed: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java trunk/src/main/org/jboss/envers/configuration/metadata/InheritanceType.java trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java trunk/src/main/org/jboss/envers/configuration/metadata/RevisionType.java trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/configuration/metadata/data/ trunk/src/main/org/jboss/envers/metadata/ trunk/src/main/org/jboss/envers/tools/Triple.java Modified: trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java trunk/src/main/org/jboss/envers/configuration/metadata/data/PropertyStoreInfo.java Log: ENVERS-37: moving metadata to configuration Modified: trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java 2008-08-14 10:19:45 UTC (rev 102) +++ trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java 2008-08-14 11:12:23 UTC (rev 103) @@ -21,7 +21,7 @@ */ package org.jboss.envers.configuration; -import org.jboss.envers.metadata.data.IdMappingData; +import org.jboss.envers.configuration.metadata.data.IdMappingData; import org.jboss.envers.mapper.ExtendedPropertyMapper; import org.jboss.envers.mapper.id.IdMapper; Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-14 10:19:45 UTC (rev 102) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-14 11:12:23 UTC (rev 103) @@ -24,10 +24,10 @@ import org.hibernate.cfg.Configuration; import org.hibernate.mapping.PersistentClass; import org.hibernate.MappingException; -import org.jboss.envers.metadata.VersionsMetadataGenerator; -import org.jboss.envers.metadata.RevisionsInfoMetadataGenerator; -import org.jboss.envers.metadata.AnnotationsMetadataReader; -import org.jboss.envers.metadata.data.PersistentClassVersioningData; +import org.jboss.envers.configuration.metadata.VersionsMetadataGenerator; +import org.jboss.envers.configuration.metadata.RevisionsInfoMetadataGenerator; +import org.jboss.envers.configuration.metadata.AnnotationsMetadataReader; +import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; import org.jboss.envers.synchronization.VersionsSyncManager; import org.jboss.envers.mapper.ExtendedPropertyMapper; import org.jboss.envers.mapper.id.IdMapper; Copied: trunk/src/main/org/jboss/envers/configuration/metadata (from rev 95, trunk/src/main/org/jboss/envers/metadata) Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/AnnotationsMetadataReader.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-14 11:12:23 UTC (rev 103) @@ -1,105 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.metadata; - -import org.jboss.envers.reflection.YClass; -import org.jboss.envers.reflection.YProperty; -import org.jboss.envers.reflection.YReflectionManager; -import org.jboss.envers.metadata.data.PersistentClassVersioningData; -import org.jboss.envers.Versioned; -import org.jboss.envers.VersionsTable; -import org.jboss.envers.SecondaryVersionsTable; -import org.jboss.envers.SecondaryVersionsTables; -import org.hibernate.mapping.PersistentClass; -import org.hibernate.MappingException; - -/** - * A helper class to read versioning meta-data from annotations on persistent classes. - * @author Adam Warski (adam at warski dot org) - */ -public class AnnotationsMetadataReader { - private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData versioningData) { - YClass superclazz = clazz.getSuperclass(); - if (!"java.lang.Object".equals(superclazz.getName())) { - addPropertiesFromClass(superclazz, versioningData); - } - - for (YProperty property : clazz.getDeclaredProperties("field")) { - Versioned ver = property.getAnnotation(Versioned.class); - if (ver != null) { - versioningData.propertyStoreInfo.propertyStores.put(property.getName(), ver.modStore()); - } - } - - for (YProperty property : clazz.getDeclaredProperties("property")) { - Versioned ver = property.getAnnotation(Versioned.class); - if (ver != null) { - versioningData.propertyStoreInfo.propertyStores.put(property.getName(), ver.modStore()); - } - } - } - - public PersistentClassVersioningData getVersioningData(PersistentClass pc, YReflectionManager reflectionManager) { - if (pc.getClassName() == null) { - return null; - } - - PersistentClassVersioningData versioningData = new PersistentClassVersioningData(); - - try { - YClass clazz = reflectionManager.classForName(pc.getClassName(), this.getClass()); - Versioned defaultVersioned = clazz.getAnnotation(Versioned.class); - - if (defaultVersioned != null) { - versioningData.propertyStoreInfo.defaultStore = defaultVersioned.modStore(); - } - - addPropertiesFromClass(clazz, versioningData); - - VersionsTable versionsTable = clazz.getAnnotation(VersionsTable.class); - if (versionsTable != null) { - versioningData.versionsTableName = versionsTable.value(); - versioningData.schema = versionsTable.schema(); - versioningData.catalog = versionsTable.catalog(); - } - - // Getting information on secondary tables - SecondaryVersionsTable secondaryVersionsTable1 = clazz.getAnnotation(SecondaryVersionsTable.class); - if (secondaryVersionsTable1 != null) { - versioningData.secondaryTableDictionary.put(secondaryVersionsTable1.secondaryTableName(), - secondaryVersionsTable1.secondaryVersionsTableName()); - } - - SecondaryVersionsTables secondaryVersionsTables = clazz.getAnnotation(SecondaryVersionsTables.class); - if (secondaryVersionsTables != null) { - for (SecondaryVersionsTable secondaryVersionsTable2 : secondaryVersionsTables.value()) { - versioningData.secondaryTableDictionary.put(secondaryVersionsTable2.secondaryTableName(), - secondaryVersionsTable2.secondaryVersionsTableName()); - } - } - } catch (ClassNotFoundException e) { - throw new MappingException(e); - } - - return versioningData; - } -} Copied: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java (from rev 102, trunk/src/main/org/jboss/envers/metadata/AnnotationsMetadataReader.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-14 11:12:23 UTC (rev 103) @@ -0,0 +1,105 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.metadata; + +import org.jboss.envers.tools.reflection.YClass; +import org.jboss.envers.tools.reflection.YProperty; +import org.jboss.envers.tools.reflection.YReflectionManager; +import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; +import org.jboss.envers.Versioned; +import org.jboss.envers.VersionsTable; +import org.jboss.envers.SecondaryVersionsTable; +import org.jboss.envers.SecondaryVersionsTables; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.MappingException; + +/** + * A helper class to read versioning meta-data from annotations on persistent classes. + * @author Adam Warski (adam at warski dot org) + */ +public class AnnotationsMetadataReader { + private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData versioningData) { + YClass superclazz = clazz.getSuperclass(); + if (!"java.lang.Object".equals(superclazz.getName())) { + addPropertiesFromClass(superclazz, versioningData); + } + + for (YProperty property : clazz.getDeclaredProperties("field")) { + Versioned ver = property.getAnnotation(Versioned.class); + if (ver != null) { + versioningData.propertyStoreInfo.propertyStores.put(property.getName(), ver.modStore()); + } + } + + for (YProperty property : clazz.getDeclaredProperties("property")) { + Versioned ver = property.getAnnotation(Versioned.class); + if (ver != null) { + versioningData.propertyStoreInfo.propertyStores.put(property.getName(), ver.modStore()); + } + } + } + + public PersistentClassVersioningData getVersioningData(PersistentClass pc, YReflectionManager reflectionManager) { + if (pc.getClassName() == null) { + return null; + } + + PersistentClassVersioningData versioningData = new PersistentClassVersioningData(); + + try { + YClass clazz = reflectionManager.classForName(pc.getClassName(), this.getClass()); + Versioned defaultVersioned = clazz.getAnnotation(Versioned.class); + + if (defaultVersioned != null) { + versioningData.propertyStoreInfo.defaultStore = defaultVersioned.modStore(); + } + + addPropertiesFromClass(clazz, versioningData); + + VersionsTable versionsTable = clazz.getAnnotation(VersionsTable.class); + if (versionsTable != null) { + versioningData.versionsTableName = versionsTable.value(); + versioningData.schema = versionsTable.schema(); + versioningData.catalog = versionsTable.catalog(); + } + + // Getting information on secondary tables + SecondaryVersionsTable secondaryVersionsTable1 = clazz.getAnnotation(SecondaryVersionsTable.class); + if (secondaryVersionsTable1 != null) { + versioningData.secondaryTableDictionary.put(secondaryVersionsTable1.secondaryTableName(), + secondaryVersionsTable1.secondaryVersionsTableName()); + } + + SecondaryVersionsTables secondaryVersionsTables = clazz.getAnnotation(SecondaryVersionsTables.class); + if (secondaryVersionsTables != null) { + for (SecondaryVersionsTable secondaryVersionsTable2 : secondaryVersionsTables.value()) { + versioningData.secondaryTableDictionary.put(secondaryVersionsTable2.secondaryTableName(), + secondaryVersionsTable2.secondaryVersionsTableName()); + } + } + } catch (ClassNotFoundException e) { + throw new MappingException(e); + } + + return versioningData; + } +} Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/InheritanceType.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/InheritanceType.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/configuration/metadata/InheritanceType.java 2008-08-14 11:12:23 UTC (rev 103) @@ -1,60 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.metadata; - -import org.hibernate.mapping.*; -import org.hibernate.MappingException; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public enum InheritanceType { - NONE, - JOINED, - SINGLE, - TABLE_PER_CLASS; - - /** - * @param pc The class for which to get the inheritance type. - * @return The inheritance type of this class. NONE, if this class does not inherit from - * another persisten class. - */ - public static InheritanceType get(PersistentClass pc) { - PersistentClass superclass = pc.getSuperclass(); - if (superclass == null) { - return InheritanceType.NONE; - } - - // We assume that every subclass is of the same type. - Subclass subclass = (Subclass) superclass.getSubclassIterator().next(); - - if (subclass instanceof SingleTableSubclass) { - return InheritanceType.SINGLE; - } else if (subclass instanceof JoinedSubclass) { - return InheritanceType.JOINED; - } else if (subclass instanceof UnionSubclass) { - return InheritanceType.TABLE_PER_CLASS; - } - - throw new MappingException("Unknown subclass class: " + subclass.getClass()); - } -} Copied: trunk/src/main/org/jboss/envers/configuration/metadata/InheritanceType.java (from rev 102, trunk/src/main/org/jboss/envers/metadata/InheritanceType.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/InheritanceType.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/InheritanceType.java 2008-08-14 11:12:23 UTC (rev 103) @@ -0,0 +1,60 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.metadata; + +import org.hibernate.mapping.*; +import org.hibernate.MappingException; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public enum InheritanceType { + NONE, + JOINED, + SINGLE, + TABLE_PER_CLASS; + + /** + * @param pc The class for which to get the inheritance type. + * @return The inheritance type of this class. NONE, if this class does not inherit from + * another persisten class. + */ + public static InheritanceType get(PersistentClass pc) { + PersistentClass superclass = pc.getSuperclass(); + if (superclass == null) { + return InheritanceType.NONE; + } + + // We assume that every subclass is of the same type. + Subclass subclass = (Subclass) superclass.getSubclassIterator().next(); + + if (subclass instanceof SingleTableSubclass) { + return InheritanceType.SINGLE; + } else if (subclass instanceof JoinedSubclass) { + return InheritanceType.JOINED; + } else if (subclass instanceof UnionSubclass) { + return InheritanceType.TABLE_PER_CLASS; + } + + throw new MappingException("Unknown subclass class: " + subclass.getClass()); + } +} Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/MetadataTools.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-08-14 11:12:23 UTC (rev 103) @@ -1,125 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.metadata; - -import org.dom4j.Element; -import org.dom4j.Document; -import org.jboss.envers.tools.StringTools; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class MetadataTools { - public static Element addNativelyGeneratedId(Element parent, String name, String type) { - Element id_mapping = parent.addElement("id"); - id_mapping.addAttribute("name", name).addAttribute("type", type); - - Element generator_mapping = id_mapping.addElement("generator"); - generator_mapping.addAttribute("class", "native"); - - return id_mapping; - } - - public static Element addProperty(Element parent, String name, String type, boolean key) { - Element prop_mapping; - if (key) { - prop_mapping = parent.addElement("key-property"); - } else { - prop_mapping = parent.addElement("property"); - } - - prop_mapping.addAttribute("name", name).addAttribute("type", type); - - return prop_mapping; - } - - public static Element addColumn(Element parent, String name, Integer length) { - Element column_mapping = parent.addElement("column"); - - column_mapping.addAttribute("name", name); - if (length != null) { - column_mapping.addAttribute("length", length.toString()); - } - - return column_mapping; - } - - private static Element createEntityCommon(Document document, String type, String entityName, - String tableName, String schema, String catalog, - String discriminatorValue) { - Element hibernate_mapping = document.addElement("hibernate-mapping"); - - Element class_mapping = hibernate_mapping.addElement(type); - class_mapping.addAttribute("entity-name", entityName); - - if (discriminatorValue != null) { - class_mapping.addAttribute("discriminator-value", discriminatorValue); - } - - if (!StringTools.isEmpty(tableName)) { - class_mapping.addAttribute("table", tableName); - } - - if (!StringTools.isEmpty(schema)) { - class_mapping.addAttribute("schema", schema); - } - - if (!StringTools.isEmpty(catalog)) { - class_mapping.addAttribute("catalog", catalog); - } - - return class_mapping; - } - - public static Element createEntity(Document document, String entityName, String tableName, - String schema, String catalog, String discriminatorValue) { - return createEntityCommon(document, "class", entityName, tableName, schema, catalog, discriminatorValue); - } - - public static Element createSubclassEntity(Document document, String entityName, String tableName, - String schema, String catalog, String extendsEntityName, - String discriminatorValue) { - Element class_mapping = createEntityCommon(document, "subclass", entityName, tableName, schema, catalog, - discriminatorValue); - - class_mapping.addAttribute("extends", extendsEntityName); - - return class_mapping; - } - - public static Element createJoin(Element parent, String tableName, - String schema, String catalog) { - Element join_mapping = parent.addElement("join"); - - join_mapping.addAttribute("table", tableName); - - if (!StringTools.isEmpty(schema)) { - join_mapping.addAttribute("schema", schema); - } - - if (!StringTools.isEmpty(catalog)) { - join_mapping.addAttribute("catalog", catalog); - } - - return join_mapping; - } -} Copied: trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java (from rev 102, trunk/src/main/org/jboss/envers/metadata/MetadataTools.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-08-14 11:12:23 UTC (rev 103) @@ -0,0 +1,125 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.metadata; + +import org.dom4j.Element; +import org.dom4j.Document; +import org.jboss.envers.tools.StringTools; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class MetadataTools { + public static Element addNativelyGeneratedId(Element parent, String name, String type) { + Element id_mapping = parent.addElement("id"); + id_mapping.addAttribute("name", name).addAttribute("type", type); + + Element generator_mapping = id_mapping.addElement("generator"); + generator_mapping.addAttribute("class", "native"); + + return id_mapping; + } + + public static Element addProperty(Element parent, String name, String type, boolean key) { + Element prop_mapping; + if (key) { + prop_mapping = parent.addElement("key-property"); + } else { + prop_mapping = parent.addElement("property"); + } + + prop_mapping.addAttribute("name", name).addAttribute("type", type); + + return prop_mapping; + } + + public static Element addColumn(Element parent, String name, Integer length) { + Element column_mapping = parent.addElement("column"); + + column_mapping.addAttribute("name", name); + if (length != null) { + column_mapping.addAttribute("length", length.toString()); + } + + return column_mapping; + } + + private static Element createEntityCommon(Document document, String type, String entityName, + String tableName, String schema, String catalog, + String discriminatorValue) { + Element hibernate_mapping = document.addElement("hibernate-mapping"); + + Element class_mapping = hibernate_mapping.addElement(type); + class_mapping.addAttribute("entity-name", entityName); + + if (discriminatorValue != null) { + class_mapping.addAttribute("discriminator-value", discriminatorValue); + } + + if (!StringTools.isEmpty(tableName)) { + class_mapping.addAttribute("table", tableName); + } + + if (!StringTools.isEmpty(schema)) { + class_mapping.addAttribute("schema", schema); + } + + if (!StringTools.isEmpty(catalog)) { + class_mapping.addAttribute("catalog", catalog); + } + + return class_mapping; + } + + public static Element createEntity(Document document, String entityName, String tableName, + String schema, String catalog, String discriminatorValue) { + return createEntityCommon(document, "class", entityName, tableName, schema, catalog, discriminatorValue); + } + + public static Element createSubclassEntity(Document document, String entityName, String tableName, + String schema, String catalog, String extendsEntityName, + String discriminatorValue) { + Element class_mapping = createEntityCommon(document, "subclass", entityName, tableName, schema, catalog, + discriminatorValue); + + class_mapping.addAttribute("extends", extendsEntityName); + + return class_mapping; + } + + public static Element createJoin(Element parent, String tableName, + String schema, String catalog) { + Element join_mapping = parent.addElement("join"); + + join_mapping.addAttribute("table", tableName); + + if (!StringTools.isEmpty(schema)) { + join_mapping.addAttribute("schema", schema); + } + + if (!StringTools.isEmpty(catalog)) { + join_mapping.addAttribute("catalog", catalog); + } + + return join_mapping; + } +} Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/RevisionType.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/RevisionType.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/configuration/metadata/RevisionType.java 2008-08-14 11:12:23 UTC (rev 103) @@ -1,33 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.metadata; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class RevisionType { - private RevisionType() { } - - public final static Byte ADD = 0; - public final static Byte MOD = 1; - public final static Byte DEL = 2; -} Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/RevisionsInfoMetadataGenerator.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java 2008-08-14 11:12:23 UTC (rev 103) @@ -1,53 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.metadata; - -import org.dom4j.Document; -import org.dom4j.DocumentHelper; -import org.dom4j.Element; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class RevisionsInfoMetadataGenerator { - private VersionsEntitiesConfiguration verEntCfg; - - public RevisionsInfoMetadataGenerator(VersionsEntitiesConfiguration verEntCfg) { - this.verEntCfg = verEntCfg; - } - - public Document generate() { - Document document = DocumentHelper.createDocument(); - - Element class_mapping = MetadataTools.createEntity(document, verEntCfg.getRevisionsInfoEntityName(), - null, null, null, null); - - MetadataTools.addNativelyGeneratedId(class_mapping, verEntCfg.getRevisionsInfoIdName(), - verEntCfg.getRevisionPropType()); - - MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionsInfoTimestampName(), - verEntCfg.getRevisionsInfoTimestampType(), false); - - return document; - } -} Copied: trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java (from rev 102, trunk/src/main/org/jboss/envers/metadata/RevisionsInfoMetadataGenerator.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java 2008-08-14 11:12:23 UTC (rev 103) @@ -0,0 +1,53 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.metadata; + +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionsInfoMetadataGenerator { + private VersionsEntitiesConfiguration verEntCfg; + + public RevisionsInfoMetadataGenerator(VersionsEntitiesConfiguration verEntCfg) { + this.verEntCfg = verEntCfg; + } + + public Document generate() { + Document document = DocumentHelper.createDocument(); + + Element class_mapping = MetadataTools.createEntity(document, verEntCfg.getRevisionsInfoEntityName(), + null, null, null, null); + + MetadataTools.addNativelyGeneratedId(class_mapping, verEntCfg.getRevisionsInfoIdName(), + verEntCfg.getRevisionPropType()); + + MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionsInfoTimestampName(), + verEntCfg.getRevisionsInfoTimestampType(), false); + + return document; + } +} Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/VersionsMetadataGenerator.java 2008-07-16 09:40:37 UTC (rev 95) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-14 11:12:23 UTC (rev 103) @@ -1,622 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.metadata; - -import org.hibernate.mapping.*; -import org.hibernate.type.*; -import org.hibernate.util.StringHelper; -import org.hibernate.MappingException; -import org.dom4j.Element; -import org.dom4j.Document; -import org.dom4j.DocumentHelper; -import org.dom4j.Attribute; -import org.dom4j.tree.DefaultElement; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; -import org.jboss.envers.configuration.EntityConfiguration; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.mapper.*; -import org.jboss.envers.mapper.id.*; -import org.jboss.envers.mapper.id.relation.ToOneIdMapper; -import org.jboss.envers.mapper.id.relation.OneToOneIdMapper; -import org.jboss.envers.mapper.id.relation.OneToManyIdMapper; -import org.jboss.envers.tools.StringTools; -import org.jboss.envers.tools.Tools; -import org.jboss.envers.tools.HibernateVersion; -import org.jboss.envers.ModificationStore; -import org.jboss.envers.log.YLog; -import org.jboss.envers.log.YLogManager; -import org.jboss.envers.metadata.data.IdMappingData; -import org.jboss.envers.metadata.data.PersistentClassVersioningData; -import org.jboss.envers.metadata.data.PropertyStoreInfo; -import org.jboss.envers.exception.VersionsException; - -import java.util.Iterator; -import java.util.Map; -import java.util.Collections; -import java.util.HashMap; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class VersionsMetadataGenerator { - private final static Map EMPTY_STORE = Collections.emptyMap(); - - private VersionsConfiguration verCfg; - private VersionsEntitiesConfiguration verEntCfg; - private Map entitiesConfigurations; - - // Map entity name -> (join descriptor -> element describing the "versioned" join) - private Map> entitiesJoins; - - private YLog log = YLogManager.getLogManager().getLog(VersionsMetadataGenerator.class); - - public VersionsMetadataGenerator(VersionsConfiguration verCfg, VersionsEntitiesConfiguration verEntCfg) { - this.verCfg = verCfg; - this.verEntCfg = verEntCfg; - - entitiesConfigurations = new HashMap(); - entitiesJoins = new HashMap>(); - } - - private void addComponentClassName(Element any_mapping, Component comp) { - if (StringHelper.isNotEmpty(comp.getComponentClassName())) { - any_mapping.addAttribute("class", comp.getComponentClassName()); - } - } - - private void addColumns(Element any_mapping, Iterator columns) { - while (columns.hasNext()) { - Column column = columns.next(); - MetadataTools.addColumn(any_mapping, column.getName(), column.getLength()); - } - } - - @SuppressWarnings({"unchecked"}) - private void addSimpleProperty(Element parent, Property property, SimpleMapperBuilder mapper, - ModificationStore store, boolean key) { - Element prop_mapping = MetadataTools.addProperty(parent, property.getName(), - property.getType().getName(), key); - addColumns(prop_mapping, (Iterator) property.getColumnIterator()); - - // A null mapper means that we only want to add xml mappings (while building the id mapping) - if (mapper != null) { - mapper.add(property.getName(), store); - } - } - - @SuppressWarnings({"unchecked"}) - private void addEnumProperty(Element parent, Property property, SimpleMapperBuilder mapper, - ModificationStore store) { - Element prop_mapping = parent.addElement("property"); - prop_mapping.addAttribute("name", property.getName()); - - CustomType propertyType = (CustomType) property.getType(); - - Element type_mapping = prop_mapping.addElement("type"); - type_mapping.addAttribute("name", propertyType.getName()); - - Element type_param1 = type_mapping.addElement("param"); - type_param1.addAttribute("name", "enumClass"); - type_param1.setText(propertyType.getReturnedClass().getName()); - - Element type_param2 = type_mapping.addElement("param"); - type_param2.addAttribute("name", "type"); - type_param2.setText(Integer.toString(propertyType.sqlTypes(null)[0])); - - addColumns(prop_mapping, (Iterator) property.getColumnIterator()); - - mapper.add(property.getName(), store); - } - - @SuppressWarnings({"unchecked"}) - private void addComponent(Element parent, Property property, CompositeMapperBuilder mapper, ModificationStore store, - String entityName, boolean firstPass) { - Element component_mapping = null; - Component prop_component = (Component) property.getValue(); - - if (!firstPass) { - // The required element already exists. - Iterator iter = parent.elementIterator("component"); - while (iter.hasNext()) { - Element child = iter.next(); - if (child.attribute("name").getText().equals(property.getName())) { - component_mapping = child; - break; - } - } - - if (component_mapping == null) { - throw new VersionsException("Element for component not found during second pass!"); - } - } else { - component_mapping = parent.addElement("component"); - component_mapping.addAttribute("name", property.getName()); - - addComponentClassName(component_mapping, prop_component); - } - - addProperties(component_mapping, (Iterator) prop_component.getPropertyIterator(), - mapper.addComposite(property.getName()), new PropertyStoreInfo(store, EMPTY_STORE), entityName, - firstPass); - } - - @SuppressWarnings({"unchecked"}) - private void changeNamesInColumnElement(Element element, Iterator columnIterator) { - Iterator properties = element.elementIterator(); - while (properties.hasNext()) { - Element property = properties.next(); - - if ("column".equals(property.getName())) { - Attribute nameAttr = property.attribute("name"); - if (nameAttr != null) { - nameAttr.setText(columnIterator.next().getName()); - } - } - } - } - - @SuppressWarnings({"unchecked"}) - private void prefixNamesInPropertyElement(Element element, String prefix, Iterator columnIterator) { - Iterator properties = element.elementIterator(); - while (properties.hasNext()) { - Element property = properties.next(); - - if ("property".equals(property.getName())) { - Attribute nameAttr = property.attribute("name"); - if (nameAttr != null) { - nameAttr.setText(prefix + nameAttr.getText()); - } - - changeNamesInColumnElement(property, columnIterator); - } - } - } - - @SuppressWarnings({"unchecked"}) - private void addToOne(Element parent, Property property, CompositeMapperBuilder mapper, String entityName) { - String referencedEntityName = ((ToOne) property.getValue()).getReferencedEntityName(); - - EntityConfiguration configuration = entitiesConfigurations.get(referencedEntityName); - if (configuration == null) { - throw new MappingException("A versioned relation to a non-versioned entity " + referencedEntityName + "!"); - } - - IdMappingData idMapping = configuration.getIdMappingData(); - - String propertyName = property.getName(); - String lastPropertyPrefix = propertyName + "_"; - - // Generating the id mapper for the relation - IdMapper relMapper = idMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); - - // Storing information about this relation - entitiesConfigurations.get(entityName).addToOneRelation(propertyName, referencedEntityName, relMapper); - - // Adding an element to the mapping corresponding to the references entity id's - Element properties = (Element) idMapping.getXmlRelationMapping().clone(); - properties.addAttribute("name", propertyName); - - prefixNamesInPropertyElement(properties, lastPropertyPrefix, property.getValue().getColumnIterator()); - parent.add(properties); - - // Adding mapper for the id - mapper.addComposite(propertyName, new ToOneIdMapper(relMapper, propertyName, referencedEntityName)); - } - - @SuppressWarnings({"unchecked"}) - private void addOneToOne(Property property, CompositeMapperBuilder mapper, String entityName) { - OneToOne propertyValue = (OneToOne) property.getValue(); - - String owningReferencePropertyName = propertyValue.getReferencedPropertyName(); // mappedBy - - EntityConfiguration configuration = entitiesConfigurations.get(entityName); - if (configuration == null) { - throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); - } - - IdMappingData ownedIdMapping = configuration.getIdMappingData(); - - if (ownedIdMapping == null) { - throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); - } - - String propertyName = property.getName(); - String lastPropertyPrefix = owningReferencePropertyName + "_"; - String referencedEntityName = propertyValue.getReferencedEntityName(); - - // Generating the id mapper for the relation - IdMapper ownedIdMapper = ownedIdMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); - - // Storing information about this relation - entitiesConfigurations.get(entityName).addOneToOneRelation(propertyName, owningReferencePropertyName, - referencedEntityName, ownedIdMapper); - - // Adding mapper for the id - mapper.addComposite(propertyName, new OneToOneIdMapper(owningReferencePropertyName, - referencedEntityName, propertyName)); - } - - @SuppressWarnings({"unchecked"}) - private String getMappedBy(Collection collectionValue) { - Iterator assocClassProps = - ((OneToMany) collectionValue.getElement()).getAssociatedClass().getPropertyIterator(); - - while (assocClassProps.hasNext()) { - Property property = assocClassProps.next(); - - if (Tools.iteratorsContentEqual(property.getValue().getColumnIterator(), - collectionValue.getKey().getColumnIterator())) { - return property.getName(); - } - } - - return null; - } - - @SuppressWarnings({"unchecked"}) - private void addOneToMany(Property property, CompositeMapperBuilder mapper, String entityName) { - Collection propertyValue = (Collection) property.getValue(); - - String owningReferencePropertyName = getMappedBy(propertyValue); - if (owningReferencePropertyName == null) { - throw new MappingException("Unable to read the mapped by attribute for " + property.getName()); - } - - EntityConfiguration configuration = entitiesConfigurations.get(entityName); - if (configuration == null) { - throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); - } - - IdMappingData referencingIdMapping = configuration.getIdMappingData(); - - String owningEntityName = ((OneToMany) propertyValue.getElement()).getReferencedEntityName(); - String propertyName = property.getName(); - String lastPropertyPrefix = owningReferencePropertyName + "_"; - - // Generating the id mapper for the relation - IdMapper ownedIdMapper = referencingIdMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); - - // Storing information about this relation - entitiesConfigurations.get(entityName).addOneToManyRelation(propertyName, owningReferencePropertyName, - owningEntityName, ownedIdMapper); - - // Adding mapper for the id - mapper.addComposite(propertyName, new OneToManyIdMapper(owningReferencePropertyName, owningEntityName, - propertyName)); - } - - private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo) { - /* - * Checks if a property is versioned, which is when: - * - the whole entity is versioned, then the default store is not null - * - there is a store defined for this entity, which is when this property is annotated - */ - - ModificationStore store = propertyStoreInfo.propertyStores.get(property.getName()); - - if (store == null) { - return propertyStoreInfo.defaultStore; - } - - return store; - } - - @SuppressWarnings({"unchecked"}) - private void addIdProperties(Element parent, Iterator properties, SimpleMapperBuilder mapper, boolean key) { - while (properties.hasNext()) { - Property property = properties.next(); - Type propertyType = property.getType(); - if (!"_identifierMapper".equals(property.getName())) { - if (propertyType instanceof ImmutableType) { - addSimpleProperty(parent, property, mapper, ModificationStore.FULL, key); - } else { - throw new MappingException("Type not supported: " + propertyType.getClass().getName()); - } - } - } - } - - @SuppressWarnings({"unchecked"}) - private void addProperties(Element parent, Iterator properties, CompositeMapperBuilder currentMapper, - PropertyStoreInfo propertyStoreInfo, String entityName, boolean firstPass) { - while (properties.hasNext()) { - Property property = properties.next(); - Type propertyType = property.getType(); - if (!"_identifierMapper".equals(property.getName())) { - ModificationStore store = getStoreForProperty(property, propertyStoreInfo); - - if (store != null) { - if (propertyType instanceof ComponentType) { - // only first pass - if (firstPass) { - addComponent(parent, property, currentMapper, store, entityName, firstPass); - } - } else if (propertyType instanceof ImmutableType || propertyType instanceof MutableType) { - // only first pass - if (firstPass) { - addSimpleProperty(parent, property, currentMapper, store, false); - } - } else if (propertyType instanceof CustomType && - "org.hibernate.type.EnumType".equals(propertyType.getName())) { - // only first pass - if (firstPass) { - addEnumProperty(parent, property, currentMapper, store); - } - } else if (propertyType instanceof ManyToOneType) { - // only second pass - if (!firstPass) { - addToOne(parent, property, currentMapper, entityName); - } - } else if (propertyType instanceof OneToOneType) { - // only second pass - if (!firstPass) { - addOneToOne(property, currentMapper, entityName); - } - } else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals( - propertyType.getClass().getName())) { - // only first pass - if (firstPass) { - addSimpleProperty(parent, property, currentMapper, store, false); - } - } else if (propertyType instanceof CustomType && - ("org.hibernate.type.PrimitiveCharacterArrayClobType".equals(propertyType.getName()) || - "org.hibernate.type.StringClobType".equals(propertyType.getName()))) { - // only first pass - if (firstPass) { - addSimpleProperty(parent, property, currentMapper, store, false); - } - } else if ((propertyType instanceof BagType || propertyType instanceof SetType) && - ((((Collection) property.getValue()).getElement() instanceof OneToMany))) { - // only second pass - if (!firstPass) { - addOneToMany(property, currentMapper, entityName); - } - } else { - String message = "Type not supported for versioning: " + propertyType.getClass().getName() + - ", on entity " + entityName + ", property '" + property.getName() + "'."; - if (verCfg.isWarnOnUnsupportedTypes()) { - log.warn(message); - } else { - throw new MappingException(message); - } - } - } - } - } - } - - @SuppressWarnings({"unchecked"}) - private void createJoins(PersistentClass pc, Element parent, PersistentClassVersioningData versioningData) { - Iterator joins = pc.getJoinIterator(); - - Map joinElements = new HashMap(); - entitiesJoins.put(pc.getEntityName(), joinElements); - - while (joins.hasNext()) { - Join join = joins.next(); - - // Determining the table name. If there is no entry in the dictionary, just constructing the table name - // as if it was an entity (by appending/prepending configured strings). - String originalTableName = join.getTable().getName(); - String versionedTableName = versioningData.secondaryTableDictionary.get(originalTableName); - if (versionedTableName == null) { - versionedTableName = verEntCfg.getVersionsEntityName(originalTableName); - } - - String schema = versioningData.schema; - if (StringTools.isEmpty(schema)) { - schema = join.getTable().getSchema(); - } - - String catalog = versioningData.catalog; - if (StringTools.isEmpty(catalog)) { - catalog = join.getTable().getCatalog(); - } - - Element joinElement = MetadataTools.createJoin(parent, versionedTableName, schema, catalog); - joinElements.put(join, joinElement); - - Element joinKey = joinElement.addElement("key"); - addColumns(joinKey, join.getKey().getColumnIterator()); - MetadataTools.addColumn(joinKey, verEntCfg.getRevisionPropName(), null); - } - } - - @SuppressWarnings({"unchecked"}) - private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PropertyStoreInfo propertyStoreInfo, - String entityName, boolean firstPass) { - Iterator joins = pc.getJoinIterator(); - - while (joins.hasNext()) { - Join join = joins.next(); - Element joinElement = entitiesJoins.get(entityName).get(join); - - addProperties(joinElement, join.getPropertyIterator(), currentMapper, propertyStoreInfo, entityName, - firstPass); - } - } - - @SuppressWarnings({"unchecked"}) - private IdMappingData addId(PersistentClass pc) { - // Mapping which will be used for relations - Element rel_id_mapping = new DefaultElement("properties"); - // Mapping which will be used for the primary key of the versions table - Element orig_id_mapping = new DefaultElement("composite-id"); - - Property id_prop = pc.getIdentifierProperty(); - Component id_mapper = pc.getIdentifierMapper(); - - SimpleIdMapperBuilder mapper; - if (id_mapper != null) { - mapper = new MultipleIdMapper(((Component) pc.getIdentifier()).getComponentClassName()); - addIdProperties(rel_id_mapping, (Iterator) id_mapper.getPropertyIterator(), mapper, false); - - // null mapper - the mapping where already added the first time, now we only want to generate the xml - addIdProperties(orig_id_mapping, (Iterator) id_mapper.getPropertyIterator(), null, true); - } else if (id_prop.isComposite()) { - Component id_component = (Component) id_prop.getValue(); - - mapper = new EmbeddedIdMapper(id_prop.getName(), id_component.getComponentClassName()); - addIdProperties(rel_id_mapping, (Iterator) id_component.getPropertyIterator(), mapper, false); - - // null mapper - the mapping where already added the first time, now we only want to generate the xml - addIdProperties(orig_id_mapping, (Iterator) id_component.getPropertyIterator(), null, true); - } else { - mapper = new SingleIdMapper(); - - addSimpleProperty(rel_id_mapping, id_prop, mapper, ModificationStore.FULL, false); - - // null mapper - the mapping where already added the first time, now we only want to generate the xml - addSimpleProperty(orig_id_mapping, id_prop, null, ModificationStore.FULL, true); - } - - orig_id_mapping.addAttribute("name", verEntCfg.getOriginalIdPropName()); - - - // Adding the "revision number" property - Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verEntCfg.getRevisionPropName(), - verEntCfg.getRevisionPropType(), true); - MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); - - return new IdMappingData(mapper, orig_id_mapping, rel_id_mapping); - } - - private void addPersisterHack(Element class_mapping) { - String persisterClassName; - if (HibernateVersion.get().startsWith("3.3")) { - persisterClassName = "org.jboss.envers.entity.VersionsInheritanceEntityPersisterFor33"; - } else { - persisterClassName = "org.jboss.envers.entity.VersionsInheritanceEntityPersisterFor32"; - } - - class_mapping.addAttribute("persister", persisterClassName); - } - - @SuppressWarnings({"unchecked"}) - public Document generateFirstPass(PersistentClass pc, PersistentClassVersioningData versioningData) { - Document document = DocumentHelper.createDocument(); - - String schema = versioningData.schema; - if (StringTools.isEmpty(schema)) { - schema = pc.getTable().getSchema(); - } - - String catalog = versioningData.catalog; - if (StringTools.isEmpty(catalog)) { - catalog = pc.getTable().getCatalog(); - } - - String entityName = pc.getEntityName(); - String versionsEntityName = verEntCfg.getVersionsEntityName(entityName); - String versionsTableName = verEntCfg.getVersionsTableName(entityName, pc.getTable().getName()); - - // Generating a mapping for the id - IdMappingData idMapper = addId(pc); - - Element class_mapping; - ExtendedPropertyMapper propertyMapper; - - InheritanceType inheritanceType = InheritanceType.get(pc); - String parentEntityName = null; - - switch (inheritanceType) { - case NONE: - class_mapping = MetadataTools.createEntity(document, versionsEntityName, versionsTableName, - schema, catalog, pc.getDiscriminatorValue()); - propertyMapper = new MultiPropertyMapper(); - - // Checking if there is a discriminator column - if (pc.getDiscriminator() != null) { - Element discriminator_element = class_mapping.addElement("discriminator"); - addColumns(discriminator_element, pc.getDiscriminator().getColumnIterator()); - discriminator_element.addAttribute("type", pc.getDiscriminator().getType().getName()); - - // If so, there is some inheritance scheme -> using the persister hack. - addPersisterHack(class_mapping); - } - - // Adding the id mapping - class_mapping.add((Element) idMapper.getXmlMapping().clone()); - - // Adding the "revision type" property - MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionTypePropName(), - verEntCfg.getRevisionTypePropType(), false); - - break; - case SINGLE: - String extendsEntityName = verEntCfg.getVersionsEntityName(pc.getSuperclass().getEntityName()); - class_mapping = MetadataTools.createSubclassEntity(document, versionsEntityName, versionsTableName, - schema, catalog, extendsEntityName, pc.getDiscriminatorValue()); - - addPersisterHack(class_mapping); - - // The id and revision type is already mapped in the parent - - // Getting the property mapper of the parent - when mapping properties, they need to be included - parentEntityName = pc.getSuperclass().getEntityName(); - ExtendedPropertyMapper parentPropertyMapper = entitiesConfigurations.get(parentEntityName).getPropertyMapper(); - propertyMapper = new SubclassPropertyMapper(new MultiPropertyMapper(), parentPropertyMapper); - - break; - case JOINED: - throw new MappingException("Joined inheritance strategy not supported for versioning!"); - case TABLE_PER_CLASS: - throw new MappingException("Table-per-class inheritance strategy not supported for versioning!"); - default: - throw new AssertionError("Impossible enum value."); - } - - // Mapping unjoined properties - addProperties(class_mapping, (Iterator) pc.getUnjoinedPropertyIterator(), propertyMapper, - versioningData.propertyStoreInfo, pc.getEntityName(), true); - - // Creating and mapping joins (first pass) - createJoins(pc, class_mapping, versioningData); - addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, pc.getEntityName(), true); - - // Storing the generated configuration - EntityConfiguration entityCfg = new EntityConfiguration(entityName, versionsEntityName, idMapper, - propertyMapper, parentEntityName); - entitiesConfigurations.put(pc.getEntityName(), entityCfg); - - return document; - } - - @SuppressWarnings({"unchecked"}) - public void generateSecondPass(PersistentClass pc, PersistentClassVersioningData versioningData, - Document document) { - String entityName = pc.getEntityName(); - - CompositeMapperBuilder propertyMapper = entitiesConfigurations.get(entityName).getPropertyMapper(); - - // Mapping unjoined properties - addProperties(document.getRootElement().element("class"), (Iterator) pc.getUnjoinedPropertyIterator(), - propertyMapper, versioningData.propertyStoreInfo, entityName, false); - - // Mapping joins (second pass) - addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName, false); - } - - public Map getEntitiesConfigurations() { - return entitiesConfigurations; - } -} Copied: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java (from rev 102, trunk/src/main/org/jboss/envers/metadata/VersionsMetadataGenerator.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-14 11:12:23 UTC (rev 103) @@ -0,0 +1,662 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.metadata; + +import org.hibernate.mapping.*; +import org.hibernate.type.*; +import org.hibernate.util.StringHelper; +import org.hibernate.MappingException; +import org.dom4j.Element; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Attribute; +import org.dom4j.tree.DefaultElement; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.configuration.EntityConfiguration; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.mapper.*; +import org.jboss.envers.mapper.id.*; +import org.jboss.envers.mapper.id.relation.ToOneIdMapper; +import org.jboss.envers.mapper.id.relation.OneToOneIdMapper; +import org.jboss.envers.mapper.id.relation.OneToManyIdMapper; +import org.jboss.envers.tools.StringTools; +import org.jboss.envers.tools.Tools; +import org.jboss.envers.tools.HibernateVersion; +import org.jboss.envers.ModificationStore; +import org.jboss.envers.tools.log.YLog; +import org.jboss.envers.tools.log.YLogManager; +import org.jboss.envers.configuration.metadata.data.IdMappingData; +import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; +import org.jboss.envers.configuration.metadata.data.PropertyStoreInfo; +import org.jboss.envers.exception.VersionsException; + +import java.util.Iterator; +import java.util.Map; +import java.util.Collections; +import java.util.HashMap; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class VersionsMetadataGenerator { + private final static Map EMPTY_STORE = Collections.emptyMap(); + + private VersionsConfiguration verCfg; + private VersionsEntitiesConfiguration verEntCfg; + private Map entitiesConfigurations; + + // Map entity name -> (join descriptor -> element describing the "versioned" join) + private Map> entitiesJoins; + + private YLog log = YLogManager.getLogManager().getLog(VersionsMetadataGenerator.class); + + public VersionsMetadataGenerator(VersionsConfiguration verCfg, VersionsEntitiesConfiguration verEntCfg) { + this.verCfg = verCfg; + this.verEntCfg = verEntCfg; + + entitiesConfigurations = new HashMap(); + entitiesJoins = new HashMap>(); + } + + private void addComponentClassName(Element any_mapping, Component comp) { + if (StringHelper.isNotEmpty(comp.getComponentClassName())) { + any_mapping.addAttribute("class", comp.getComponentClassName()); + } + } + + private void addColumns(Element any_mapping, Iterator columns) { + while (columns.hasNext()) { + Column column = columns.next(); + MetadataTools.addColumn(any_mapping, column.getName(), column.getLength()); + } + } + + @SuppressWarnings({"unchecked"}) + private void addSimpleProperty(Element parent, Property property, SimpleMapperBuilder mapper, + ModificationStore store, boolean key) { + Element prop_mapping = MetadataTools.addProperty(parent, property.getName(), + property.getType().getName(), key); + addColumns(prop_mapping, (Iterator) property.getColumnIterator()); + + // A null mapper means that we only want to add xml mappings (while building the id mapping) + if (mapper != null) { + mapper.add(property.getName(), store); + } + } + + @SuppressWarnings({"unchecked"}) + private void addEnumProperty(Element parent, Property property, SimpleMapperBuilder mapper, + ModificationStore store) { + Element prop_mapping = parent.addElement("property"); + prop_mapping.addAttribute("name", property.getName()); + + CustomType propertyType = (CustomType) property.getType(); + + Element type_mapping = prop_mapping.addElement("type"); + type_mapping.addAttribute("name", propertyType.getName()); + + Element type_param1 = type_mapping.addElement("param"); + type_param1.addAttribute("name", "enumClass"); + type_param1.setText(propertyType.getReturnedClass().getName()); + + Element type_param2 = type_mapping.addElement("param"); + type_param2.addAttribute("name", "type"); + type_param2.setText(Integer.toString(propertyType.sqlTypes(null)[0])); + + addColumns(prop_mapping, (Iterator) property.getColumnIterator()); + + mapper.add(property.getName(), store); + } + + @SuppressWarnings({"unchecked"}) + private void addComponent(Element parent, Property property, CompositeMapperBuilder mapper, ModificationStore store, + String entityName, boolean firstPass) { + Element component_mapping = null; + Component prop_component = (Component) property.getValue(); + + if (!firstPass) { + // The required element already exists. + Iterator iter = parent.elementIterator("component"); + while (iter.hasNext()) { + Element child = iter.next(); + if (child.attribute("name").getText().equals(property.getName())) { + component_mapping = child; + break; + } + } + + if (component_mapping == null) { + throw new VersionsException("Element for component not found during second pass!"); + } + } else { + component_mapping = parent.addElement("component"); + component_mapping.addAttribute("name", property.getName()); + + addComponentClassName(component_mapping, prop_component); + } + + addProperties(component_mapping, (Iterator) prop_component.getPropertyIterator(), + mapper.addComposite(property.getName()), new PropertyStoreInfo(store, EMPTY_STORE), entityName, + firstPass); + } + + @SuppressWarnings({"unchecked"}) + private void changeNamesInColumnElement(Element element, Iterator columnIterator) { + Iterator properties = element.elementIterator(); + while (properties.hasNext()) { + Element property = properties.next(); + + if ("column".equals(property.getName())) { + Attribute nameAttr = property.attribute("name"); + if (nameAttr != null) { + nameAttr.setText(columnIterator.next().getName()); + } + } + } + } + + @SuppressWarnings({"unchecked"}) + private void prefixNamesInPropertyElement(Element element, String prefix, Iterator columnIterator) { + Iterator properties = element.elementIterator(); + while (properties.hasNext()) { + Element property = properties.next(); + + if ("property".equals(property.getName())) { + Attribute nameAttr = property.attribute("name"); + if (nameAttr != null) { + nameAttr.setText(prefix + nameAttr.getText()); + } + + changeNamesInColumnElement(property, columnIterator); + } + } + } + + @SuppressWarnings({"unchecked"}) + private void addToOne(Element parent, Property property, CompositeMapperBuilder mapper, String entityName) { + String referencedEntityName = ((ToOne) property.getValue()).getReferencedEntityName(); + + EntityConfiguration configuration = entitiesConfigurations.get(referencedEntityName); + if (configuration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + referencedEntityName + "!"); + } + + IdMappingData idMapping = configuration.getIdMappingData(); + + String propertyName = property.getName(); + String lastPropertyPrefix = propertyName + "_"; + + // Generating the id mapper for the relation + IdMapper relMapper = idMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); + + // Storing information about this relation + entitiesConfigurations.get(entityName).addToOneRelation(propertyName, referencedEntityName, relMapper); + + // Adding an element to the mapping corresponding to the references entity id's + Element properties = (Element) idMapping.getXmlRelationMapping().clone(); + properties.addAttribute("name", propertyName); + + prefixNamesInPropertyElement(properties, lastPropertyPrefix, property.getValue().getColumnIterator()); + parent.add(properties); + + // Adding mapper for the id + mapper.addComposite(propertyName, new ToOneIdMapper(relMapper, propertyName, referencedEntityName)); + } + + @SuppressWarnings({"unchecked"}) + private void addOneToOneBidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { + OneToOne propertyValue = (OneToOne) property.getValue(); + + String owningReferencePropertyName = propertyValue.getReferencedPropertyName(); // mappedBy + + EntityConfiguration configuration = entitiesConfigurations.get(entityName); + if (configuration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); + } + + IdMappingData ownedIdMapping = configuration.getIdMappingData(); + + if (ownedIdMapping == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); + } + + String propertyName = property.getName(); + String lastPropertyPrefix = owningReferencePropertyName + "_"; + String referencedEntityName = propertyValue.getReferencedEntityName(); + + // Generating the id mapper for the relation + IdMapper ownedIdMapper = ownedIdMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); + + // Storing information about this relation + entitiesConfigurations.get(entityName).addOneToOneRelation(propertyName, owningReferencePropertyName, + referencedEntityName, ownedIdMapper); + + // Adding mapper for the id + mapper.addComposite(propertyName, new OneToOneIdMapper(owningReferencePropertyName, + referencedEntityName, propertyName)); + } + + @SuppressWarnings({"unchecked"}) + private String getMappedBy(Collection collectionValue) { + Iterator assocClassProps = + ((OneToMany) collectionValue.getElement()).getAssociatedClass().getPropertyIterator(); + + while (assocClassProps.hasNext()) { + Property property = assocClassProps.next(); + + if (Tools.iteratorsContentEqual(property.getValue().getColumnIterator(), + collectionValue.getKey().getColumnIterator())) { + return property.getName(); + } + } + + return null; + } + + @SuppressWarnings({"unchecked"}) + private void addOneToManyBidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { + Collection propertyValue = (Collection) property.getValue(); + + String owningReferencePropertyName = getMappedBy(propertyValue); + if (owningReferencePropertyName == null) { + throw new MappingException("Unable to read the mapped by attribute for " + property.getName()); + } + + EntityConfiguration configuration = entitiesConfigurations.get(entityName); + if (configuration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); + } + + IdMappingData referencingIdMapping = configuration.getIdMappingData(); + + String owningEntityName = ((OneToMany) propertyValue.getElement()).getReferencedEntityName(); + String propertyName = property.getName(); + String lastPropertyPrefix = owningReferencePropertyName + "_"; + + // Generating the id mapper for the relation + IdMapper ownedIdMapper = referencingIdMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); + + // Storing information about this relation + entitiesConfigurations.get(entityName).addOneToManyRelation(propertyName, owningReferencePropertyName, + owningEntityName, ownedIdMapper); + + // Adding mapper for the id + mapper.addComposite(propertyName, new OneToManyIdMapper(owningReferencePropertyName, owningEntityName, + propertyName)); + } + + @SuppressWarnings({"unchecked"}) + private void addOneToManyUnidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { + Collection propertyValue = (Collection) property.getValue(); + ManyToOne mto = (ManyToOne) propertyValue.getElement(); + + String referencedEntityName = mto.getReferencedEntityName(); + + EntityConfiguration configuration = entitiesConfigurations.get(entityName); + if (configuration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); + } + + EntityConfiguration referencedConfiguration = entitiesConfigurations.get(referencedEntityName); + if (referencedConfiguration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + referencedEntityName + "!"); + } + + IdMappingData referencingIdMapping = configuration.getIdMappingData(); + IdMappingData referencedIdMapping = referencedConfiguration.getIdMappingData(); + + // Name of the entity that will be used to store the relation between the two entities. + String middleEntityName = entityName + "_" + referencedEntityName; + + MetadataTools.createEntity(null, middleEntityName, mto.getTable().getName(), mto.getTable().getSchema(), + mto.getTable().getCatalog(), null); + + // TODO: ??? + } + + private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo) { + /* + * Checks if a property is versioned, which is when: + * - the whole entity is versioned, then the default store is not null + * - there is a store defined for this entity, which is when this property is annotated + */ + + ModificationStore store = propertyStoreInfo.propertyStores.get(property.getName()); + + if (store == null) { + return propertyStoreInfo.defaultStore; + } + + return store; + } + + @SuppressWarnings({"unchecked"}) + private void addIdProperties(Element parent, Iterator properties, SimpleMapperBuilder mapper, boolean key) { + while (properties.hasNext()) { + Property property = properties.next(); + Type propertyType = property.getType(); + if (!"_identifierMapper".equals(property.getName())) { + if (propertyType instanceof ImmutableType) { + addSimpleProperty(parent, property, mapper, ModificationStore.FULL, key); + } else { + throw new MappingException("Type not supported: " + propertyType.getClass().getName()); + } + } + } + } + + @SuppressWarnings({"unchecked"}) + private void addProperties(Element parent, Iterator properties, CompositeMapperBuilder currentMapper, + PropertyStoreInfo propertyStoreInfo, String entityName, boolean firstPass) { + while (properties.hasNext()) { + Property property = properties.next(); + Type propertyType = property.getType(); + if (!"_identifierMapper".equals(property.getName())) { + ModificationStore store = getStoreForProperty(property, propertyStoreInfo); + + if (store != null) { + if (propertyType instanceof ComponentType) { + // only first pass + if (firstPass) { + addComponent(parent, property, currentMapper, store, entityName, firstPass); + } + } else if (propertyType instanceof ImmutableType || propertyType instanceof MutableType) { + // only first pass + if (firstPass) { + addSimpleProperty(parent, property, currentMapper, store, false); + } + } else if (propertyType instanceof CustomType && + "org.hibernate.type.EnumType".equals(propertyType.getName())) { + // only first pass + if (firstPass) { + addEnumProperty(parent, property, currentMapper, store); + } + } else if (propertyType instanceof ManyToOneType) { + // only second pass + if (!firstPass) { + addToOne(parent, property, currentMapper, entityName); + } + } else if (propertyType instanceof OneToOneType) { + // only second pass + if (!firstPass) { + addOneToOneBidirectional(property, currentMapper, entityName); + } + } else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals( + propertyType.getClass().getName())) { + // only first pass + if (firstPass) { + addSimpleProperty(parent, property, currentMapper, store, false); + } + } else if (propertyType instanceof CustomType && + ("org.hibernate.type.PrimitiveCharacterArrayClobType".equals(propertyType.getName()) || + "org.hibernate.type.StringClobType".equals(propertyType.getName()))) { + // only first pass + if (firstPass) { + addSimpleProperty(parent, property, currentMapper, store, false); + } + } else if ((propertyType instanceof BagType || propertyType instanceof SetType) && + ((((Collection) property.getValue()).getElement() instanceof OneToMany))) { + // only second pass + if (!firstPass) { + addOneToManyBidirectional(property, currentMapper, entityName); + } + } else if ((propertyType instanceof BagType || propertyType instanceof SetType) && + ((((Collection) property.getValue()).getElement() instanceof ManyToOne))) { + // only second pass + if (!firstPass) { + addOneToManyUnidirectional(property, currentMapper, entityName); + } + } else { + String message = "Type not supported for versioning: " + propertyType.getClass().getName() + + ", on entity " + entityName + ", property '" + property.getName() + "'."; + if (verCfg.isWarnOnUnsupportedTypes()) { + log.warn(message); + } else { + throw new MappingException(message); + } + } + } + } + } + } + + @SuppressWarnings({"unchecked"}) + private void createJoins(PersistentClass pc, Element parent, PersistentClassVersioningData versioningData) { + Iterator joins = pc.getJoinIterator(); + + Map joinElements = new HashMap(); + entitiesJoins.put(pc.getEntityName(), joinElements); + + while (joins.hasNext()) { + Join join = joins.next(); + + // Determining the table name. If there is no entry in the dictionary, just constructing the table name + // as if it was an entity (by appending/prepending configured strings). + String originalTableName = join.getTable().getName(); + String versionedTableName = versioningData.secondaryTableDictionary.get(originalTableName); + if (versionedTableName == null) { + versionedTableName = verEntCfg.getVersionsEntityName(originalTableName); + } + + String schema = versioningData.schema; + if (StringTools.isEmpty(schema)) { + schema = join.getTable().getSchema(); + } + + String catalog = versioningData.catalog; + if (StringTools.isEmpty(catalog)) { + catalog = join.getTable().getCatalog(); + } + + Element joinElement = MetadataTools.createJoin(parent, versionedTableName, schema, catalog); + joinElements.put(join, joinElement); + + Element joinKey = joinElement.addElement("key"); + addColumns(joinKey, join.getKey().getColumnIterator()); + MetadataTools.addColumn(joinKey, verEntCfg.getRevisionPropName(), null); + } + } + + @SuppressWarnings({"unchecked"}) + private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PropertyStoreInfo propertyStoreInfo, + String entityName, boolean firstPass) { + Iterator joins = pc.getJoinIterator(); + + while (joins.hasNext()) { + Join join = joins.next(); + Element joinElement = entitiesJoins.get(entityName).get(join); + + addProperties(joinElement, join.getPropertyIterator(), currentMapper, propertyStoreInfo, entityName, + firstPass); + } + } + + @SuppressWarnings({"unchecked"}) + private IdMappingData addId(PersistentClass pc) { + // Xml mapping which will be used for relations + Element rel_id_mapping = new DefaultElement("properties"); + // Xml mapping which will be used for the primary key of the versions table + Element orig_id_mapping = new DefaultElement("composite-id"); + + Property id_prop = pc.getIdentifierProperty(); + Component id_mapper = pc.getIdentifierMapper(); + + SimpleIdMapperBuilder mapper; + if (id_mapper != null) { + mapper = new MultipleIdMapper(((Component) pc.getIdentifier()).getComponentClassName()); + addIdProperties(rel_id_mapping, (Iterator) id_mapper.getPropertyIterator(), mapper, false); + + // null mapper - the mapping where already added the first time, now we only want to generate the xml + addIdProperties(orig_id_mapping, (Iterator) id_mapper.getPropertyIterator(), null, true); + } else if (id_prop.isComposite()) { + Component id_component = (Component) id_prop.getValue(); + + mapper = new EmbeddedIdMapper(id_prop.getName(), id_component.getComponentClassName()); + addIdProperties(rel_id_mapping, (Iterator) id_component.getPropertyIterator(), mapper, false); + + // null mapper - the mapping where already added the first time, now we only want to generate the xml + addIdProperties(orig_id_mapping, (Iterator) id_component.getPropertyIterator(), null, true); + } else { + mapper = new SingleIdMapper(); + + addSimpleProperty(rel_id_mapping, id_prop, mapper, ModificationStore.FULL, false); + + // null mapper - the mapping where already added the first time, now we only want to generate the xml + addSimpleProperty(orig_id_mapping, id_prop, null, ModificationStore.FULL, true); + } + + orig_id_mapping.addAttribute("name", verEntCfg.getOriginalIdPropName()); + + // Adding the "revision number" property + Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verEntCfg.getRevisionPropName(), + verEntCfg.getRevisionPropType(), true); + MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); + + return new IdMappingData(mapper, orig_id_mapping, rel_id_mapping); + } + + private void addPersisterHack(Element class_mapping) { + String persisterClassName; + if (HibernateVersion.get().startsWith("3.3")) { + persisterClassName = "org.jboss.envers.entity.VersionsInheritanceEntityPersisterFor33"; + } else { + persisterClassName = "org.jboss.envers.entity.VersionsInheritanceEntityPersisterFor32"; + } + + class_mapping.addAttribute("persister", persisterClassName); + } + + @SuppressWarnings({"unchecked"}) + public Document generateFirstPass(PersistentClass pc, PersistentClassVersioningData versioningData) { + Document document = DocumentHelper.createDocument(); + + String schema = versioningData.schema; + if (StringTools.isEmpty(schema)) { + schema = pc.getTable().getSchema(); + } + + String catalog = versioningData.catalog; + if (StringTools.isEmpty(catalog)) { + catalog = pc.getTable().getCatalog(); + } + + String entityName = pc.getEntityName(); + String versionsEntityName = verEntCfg.getVersionsEntityName(entityName); + String versionsTableName = verEntCfg.getVersionsTableName(entityName, pc.getTable().getName()); + + // Generating a mapping for the id + IdMappingData idMapper = addId(pc); + + Element class_mapping; + ExtendedPropertyMapper propertyMapper; + + InheritanceType inheritanceType = InheritanceType.get(pc); + String parentEntityName = null; + + switch (inheritanceType) { + case NONE: + class_mapping = MetadataTools.createEntity(document, versionsEntityName, versionsTableName, + schema, catalog, pc.getDiscriminatorValue()); + propertyMapper = new MultiPropertyMapper(); + + // Checking if there is a discriminator column + if (pc.getDiscriminator() != null) { + Element discriminator_element = class_mapping.addElement("discriminator"); + addColumns(discriminator_element, pc.getDiscriminator().getColumnIterator()); + discriminator_element.addAttribute("type", pc.getDiscriminator().getType().getName()); + + // If so, there is some inheritance scheme -> using the persister hack. + addPersisterHack(class_mapping); + } + + // Adding the id mapping + class_mapping.add((Element) idMapper.getXmlMapping().clone()); + + // Adding the "revision type" property + Element revTypeProperty = MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionTypePropName(), + verEntCfg.getRevisionTypePropType(), false); + revTypeProperty.addAttribute("type", "org.jboss.envers.entity.RevisionTypeType"); + + break; + case SINGLE: + String extendsEntityName = verEntCfg.getVersionsEntityName(pc.getSuperclass().getEntityName()); + class_mapping = MetadataTools.createSubclassEntity(document, versionsEntityName, versionsTableName, + schema, catalog, extendsEntityName, pc.getDiscriminatorValue()); + + addPersisterHack(class_mapping); + + // The id and revision type is already mapped in the parent + + // Getting the property mapper of the parent - when mapping properties, they need to be included + parentEntityName = pc.getSuperclass().getEntityName(); + ExtendedPropertyMapper parentPropertyMapper = entitiesConfigurations.get(parentEntityName).getPropertyMapper(); + propertyMapper = new SubclassPropertyMapper(new MultiPropertyMapper(), parentPropertyMapper); + + break; + case JOINED: + throw new MappingException("Joined inheritance strategy not supported for versioning!"); + case TABLE_PER_CLASS: + throw new MappingException("Table-per-class inheritance strategy not supported for versioning!"); + default: + throw new AssertionError("Impossible enum value."); + } + + // Mapping unjoined properties + addProperties(class_mapping, (Iterator) pc.getUnjoinedPropertyIterator(), propertyMapper, + versioningData.propertyStoreInfo, pc.getEntityName(), true); + + // Creating and mapping joins (first pass) + createJoins(pc, class_mapping, versioningData); + addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, pc.getEntityName(), true); + + // Storing the generated configuration + EntityConfiguration entityCfg = new EntityConfiguration(entityName, versionsEntityName, idMapper, + propertyMapper, parentEntityName); + entitiesConfigurations.put(pc.getEntityName(), entityCfg); + + return document; + } + + @SuppressWarnings({"unchecked"}) + public void generateSecondPass(PersistentClass pc, PersistentClassVersioningData versioningData, + Document document) { + String entityName = pc.getEntityName(); + + CompositeMapperBuilder propertyMapper = entitiesConfigurations.get(entityName).getPropertyMapper(); + + // Mapping unjoined properties + Element parent = document.getRootElement().element("class"); + if (parent == null) { + parent = document.getRootElement().element("subclass"); + } + + addProperties(parent, (Iterator) pc.getUnjoinedPropertyIterator(), + propertyMapper, versioningData.propertyStoreInfo, entityName, false); + + // Mapping joins (second pass) + addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName, false); + } + + public Map getEntitiesConfigurations() { + return entitiesConfigurations; + } +} Copied: trunk/src/main/org/jboss/envers/configuration/metadata/data (from rev 102, trunk/src/main/org/jboss/envers/metadata/data) Modified: trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/data/IdMappingData.java 2008-08-14 10:19:45 UTC (rev 102) +++ trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java 2008-08-14 11:12:23 UTC (rev 103) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.metadata.data; +package org.jboss.envers.configuration.metadata.data; import org.jboss.envers.mapper.id.IdMapper; import org.dom4j.Element; Modified: trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/data/PersistentClassVersioningData.java 2008-08-14 10:19:45 UTC (rev 102) +++ trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java 2008-08-14 11:12:23 UTC (rev 103) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.metadata.data; +package org.jboss.envers.configuration.metadata.data; import org.jboss.envers.ModificationStore; Modified: trunk/src/main/org/jboss/envers/configuration/metadata/data/PropertyStoreInfo.java =================================================================== --- trunk/src/main/org/jboss/envers/metadata/data/PropertyStoreInfo.java 2008-08-14 10:19:45 UTC (rev 102) +++ trunk/src/main/org/jboss/envers/configuration/metadata/data/PropertyStoreInfo.java 2008-08-14 11:12:23 UTC (rev 103) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.metadata.data; +package org.jboss.envers.configuration.metadata.data; import org.jboss.envers.ModificationStore; Deleted: trunk/src/main/org/jboss/envers/tools/Triple.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/Triple.java 2008-08-14 10:19:45 UTC (rev 102) +++ trunk/src/main/org/jboss/envers/tools/Triple.java 2008-08-14 11:12:23 UTC (rev 103) @@ -1,78 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.tools; - -/** - * A triple of objects. - * @param - * @param - * @param - * @author Adam Warski (adamw at aster.pl) - */ -public class Triple { - private T1 obj1; - private T2 obj2; - private T3 obj3; - - public Triple(T1 obj1, T2 obj2, T3 obj3) { - this.obj1 = obj1; - this.obj2 = obj2; - this.obj3 = obj3; - } - - public T1 getFirst() { - return obj1; - } - - public T2 getSecond() { - return obj2; - } - - public T3 getThird() { - return obj3; - } - - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Triple)) return false; - - Triple triple = (Triple) o; - - if (obj1 != null ? !obj1.equals(triple.obj1) : triple.obj1 != null) return false; - if (obj2 != null ? !obj2.equals(triple.obj2) : triple.obj2 != null) return false; - if (obj3 != null ? !obj3.equals(triple.obj3) : triple.obj3 != null) return false; - - return true; - } - - public int hashCode() { - int result; - result = (obj1 != null ? obj1.hashCode() : 0); - result = 31 * result + (obj2 != null ? obj2.hashCode() : 0); - result = 31 * result + (obj3 != null ? obj3.hashCode() : 0); - return result; - } - - public static Triple make(T1 obj1, T2 obj2, T3 obj3) { - return new Triple(obj1, obj2, obj3); - } -} \ No newline at end of file From jboss-envers-commits at lists.jboss.org Thu Aug 14 11:39:48 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 14 Aug 2008 11:39:48 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r104 - in trunk/src/main/org/jboss/envers: configuration and 14 other directories. Message-ID: Author: adamw Date: 2008-08-14 11:39:48 -0400 (Thu, 14 Aug 2008) New Revision: 104 Added: trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java trunk/src/main/org/jboss/envers/configuration/entities/ trunk/src/main/org/jboss/envers/configuration/entities/EntitiesConfigurations.java trunk/src/main/org/jboss/envers/configuration/entities/EntityConfiguration.java trunk/src/main/org/jboss/envers/configuration/entities/IdMappingData.java trunk/src/main/org/jboss/envers/revisioninfo/ trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java Removed: trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/configuration/DefaultRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/configuration/RevisionInfoGenerator.java trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/query/RevisionProperty.java trunk/src/main/org/jboss/envers/query/RevisionTypeProperty.java trunk/src/main/org/jboss/envers/query/criteria/AggregatedFieldVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java trunk/src/main/org/jboss/envers/query/criteria/IdentifierEqVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/RevisionVersionsExpression.java trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java Log: ENVERS-37: componentizing configuration Deleted: trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/CustomRevisionInfoGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -1,73 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration; - -import org.jboss.envers.RevisionListener; -import org.jboss.envers.tools.reflection.ReflectionTools; -import org.hibernate.MappingException; -import org.hibernate.property.Setter; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class CustomRevisionInfoGenerator implements RevisionInfoGenerator { - private RevisionListener listener; - private Setter revisionTimestampSetter; - private Class entityClass; - - public CustomRevisionInfoGenerator(VersionsEntitiesConfiguration verEntCfg, - Class entityClass, - Class listenerClass) { - this.entityClass = entityClass; - - revisionTimestampSetter = ReflectionTools.getSetter(entityClass, - verEntCfg.getRevisionsInfoTimestampName()); - - if (!listenerClass.equals(RevisionListener.class)) { - // This is not the default value. - try { - listener = listenerClass.newInstance(); - } catch (InstantiationException e) { - throw new MappingException(e); - } catch (IllegalAccessException e) { - throw new MappingException(e); - } - } - } - - public Object newRevision() { - Object entity; - try { - entity = entityClass.newInstance(); - } catch (Exception e) { - throw new RuntimeException(e); - } - - revisionTimestampSetter.set(entity, System.currentTimeMillis(), null); - - if (listener != null) { - listener.newRevision(entity); - } - - return entity; - } -} Deleted: trunk/src/main/org/jboss/envers/configuration/DefaultRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/DefaultRevisionInfoGenerator.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/DefaultRevisionInfoGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -1,43 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration; - -import java.util.Map; -import java.util.HashMap; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class DefaultRevisionInfoGenerator implements RevisionInfoGenerator { - private VersionsEntitiesConfiguration verEntCfg; - - public DefaultRevisionInfoGenerator(VersionsEntitiesConfiguration verEntCfg) { - this.verEntCfg = verEntCfg; - } - - public Object newRevision() { - Map revisionInfo = new HashMap(); - revisionInfo.put(verEntCfg.getRevisionsInfoTimestampName(), System.currentTimeMillis()); - - return revisionInfo; - } -} Added: trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,32 @@ +package org.jboss.envers.configuration; + +import java.util.Properties; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class GlobalConfiguration { + // Should a revision be generated when a not-owned relation field changes + private final boolean generateRevisionsForCollections; + + // Should a warning, instead of an error and an exception, be logged, when an unsupported type is versioned + private final boolean warnOnUnsupportedTypes; + + public GlobalConfiguration(Properties properties) { + String generateRevisionsForCollectionsStr = properties.getProperty("org.jboss.envers.revisionOnCollectionChange", + "true"); + generateRevisionsForCollections = Boolean.parseBoolean(generateRevisionsForCollectionsStr); + + String warnOnUnsupportedTypesStr = properties.getProperty("org.jboss.envers.warnOnUnsupportedTypes", + "false"); + warnOnUnsupportedTypes = Boolean.parseBoolean(warnOnUnsupportedTypesStr); + } + + public boolean isGenerateRevisionsForCollections() { + return generateRevisionsForCollections; + } + + public boolean isWarnOnUnsupportedTypes() { + return warnOnUnsupportedTypes; + } +} Added: trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,215 @@ +package org.jboss.envers.configuration; + +import org.jboss.envers.tools.reflection.YClass; +import org.jboss.envers.tools.reflection.YReflectionManager; +import org.jboss.envers.tools.reflection.YProperty; +import org.jboss.envers.tools.MutableBoolean; +import org.jboss.envers.RevisionNumber; +import org.jboss.envers.RevisionTimestamp; +import org.jboss.envers.RevisionEntity; +import org.jboss.envers.Versioned; +import org.jboss.envers.configuration.metadata.MetadataTools; +import org.jboss.envers.revisioninfo.CustomRevisionInfoGenerator; +import org.jboss.envers.revisioninfo.DefaultRevisionInfoGenerator; +import org.jboss.envers.revisioninfo.RevisionNumberGenerator; +import org.jboss.envers.revisioninfo.RevisionInfoGenerator; +import org.hibernate.MappingException; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.cfg.Configuration; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import java.util.Iterator; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionInfoConfiguration { + private String revisionInfoEntityName; + private String revisionInfoIdName; + private String revisionInfoTimestampName; + private String revisionInfoTimestampType; + + private String revisionPropType; + + public RevisionInfoConfiguration() { + revisionInfoEntityName = "_revisions_info"; + revisionInfoIdName = "revision_id"; + revisionInfoTimestampName = "revision_timestamp"; + revisionInfoTimestampType = "long"; + + revisionPropType = "integer"; + } + + private Document generateDefaultRevisionInfoXmlMapping() { + Document document = DocumentHelper.createDocument(); + + Element class_mapping = MetadataTools.createEntity(document, revisionInfoEntityName, + null, null, null, null); + + MetadataTools.addNativelyGeneratedId(class_mapping, revisionInfoIdName, + revisionPropType); + + MetadataTools.addProperty(class_mapping, revisionInfoTimestampName, + revisionInfoTimestampType, false); + + return document; + } + + private void searchForRevisionInfoCfg(YClass clazz, YReflectionManager reflectionManager, + MutableBoolean revisionNumberFound, MutableBoolean revisionTimestampFound) { + YClass superclazz = clazz.getSuperclass(); + if (!"java.lang.Object".equals(superclazz.getName())) { + searchForRevisionInfoCfg(superclazz, reflectionManager, revisionNumberFound, revisionTimestampFound); + } + + for (YProperty property : clazz.getDeclaredProperties("field")) { + RevisionNumber revisionNumber = property.getAnnotation(RevisionNumber.class); + RevisionTimestamp revisionTimestamp = property.getAnnotation(RevisionTimestamp.class); + + if (revisionNumber != null) { + if (revisionNumberFound.isSet()) { + throw new MappingException("Only one property may be annotated with @RevisionNumber!"); + } + + YClass revisionNumberClass = property.getType(); + if (reflectionManager.equals(revisionNumberClass, Integer.class) || + reflectionManager.equals(revisionNumberClass, Integer.TYPE)) { + revisionInfoIdName = property.getName(); + revisionNumberFound.set(); + } else if (reflectionManager.equals(revisionNumberClass, Long.class) || + reflectionManager.equals(revisionNumberClass, Long.TYPE)) { + revisionInfoIdName = property.getName(); + revisionNumberFound.set(); + + // The default is integer + revisionPropType = "long"; + } else { + throw new MappingException("The field annotated with @RevisionNumber must be of type " + + "int, Integer, long or Long"); + } + } + + if (revisionTimestamp != null) { + if (revisionTimestampFound.isSet()) { + throw new MappingException("Only one property may be annotated with @RevisionTimestamp!"); + } + + YClass revisionTimestampClass = property.getType(); + if (reflectionManager.equals(revisionTimestampClass, Long.class) || + reflectionManager.equals(revisionTimestampClass, Long.TYPE)) { + revisionInfoTimestampName = property.getName(); + revisionTimestampFound.set(); + } else { + throw new MappingException("The field annotated with @RevisionTimestamp must be of type " + + "long or Long"); + } + } + } + } + + @SuppressWarnings({"unchecked"}) + public RevisionInfoConfigurationResult configure(Configuration cfg, YReflectionManager reflectionManager) { + Iterator classes = (Iterator) cfg.getClassMappings(); + boolean revisionEntityFound = false; + RevisionInfoGenerator revisionInfoGenerator = null; + + while (classes.hasNext()) { + PersistentClass pc = classes.next(); + YClass clazz; + try { + clazz = reflectionManager.classForName(pc.getClassName(), this.getClass()); + } catch (ClassNotFoundException e) { + throw new MappingException(e); + } + + RevisionEntity revisionEntity = clazz.getAnnotation(RevisionEntity.class); + if (revisionEntity != null) { + if (revisionEntityFound) { + throw new MappingException("Only one entity may be annotated with @RevisionEntity!"); + } + + // Checking if custom revision entity isn't versioned + if (clazz.getAnnotation(Versioned.class) != null) { + throw new MappingException("An entity annotated with @RevisionEntity cannot be versioned!"); + } + + revisionEntityFound = true; + + MutableBoolean revisionNumberFound = new MutableBoolean(); + MutableBoolean revisionTimestampFound = new MutableBoolean(); + + searchForRevisionInfoCfg(clazz, reflectionManager, revisionNumberFound, revisionTimestampFound); + + if (!revisionNumberFound.isSet()) { + throw new MappingException("An entity annotated with @RevisionEntity must have a field annotated " + + "with @RevisionNumber!"); + } + + if (!revisionTimestampFound.isSet()) { + throw new MappingException("An entity annotated with @RevisionEntity must have a field annotated " + + "with @RevisionTimestamp!"); + } + + revisionInfoEntityName = pc.getEntityName(); + + revisionInfoGenerator = new CustomRevisionInfoGenerator(pc.getMappedClass(), + revisionEntity.value(), revisionInfoTimestampName); + } + } + + // In case of a custom revision info generator, the mapping will be null. + Document revisionInfoXmlMapping = null; + + if (revisionInfoGenerator == null) { + revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoTimestampName); + revisionInfoXmlMapping = generateDefaultRevisionInfoXmlMapping(); + } + + return new RevisionInfoConfigurationResult( + new RevisionNumberGenerator(revisionInfoEntityName, revisionInfoGenerator), + revisionPropType, + revisionInfoXmlMapping); + } + + public boolean isRevisionInfoEntityName(String entityName) { + return revisionInfoEntityName.equals(entityName); + } + + public String getRevisionInfoEntityName() { + return revisionInfoEntityName; + } + + public String getRevisionInfoIdName() { + return revisionInfoIdName; + } + + public String getRevisionInfoTimestampName() { + return revisionInfoTimestampName; + } +} + +class RevisionInfoConfigurationResult { + private final RevisionNumberGenerator revisionNumberGenerator; + private final String revisionPropType; + private final Document revisionInfoXmlMapping; + + RevisionInfoConfigurationResult(RevisionNumberGenerator revisionNumberGenerator, String revisionPropType, Document revisionInfoXmlMapping) { + this.revisionNumberGenerator = revisionNumberGenerator; + this.revisionPropType = revisionPropType; + this.revisionInfoXmlMapping = revisionInfoXmlMapping; + } + + public RevisionNumberGenerator getRevisionNumberGenerator() { + return revisionNumberGenerator; + } + + public String getRevisionPropType() { + return revisionPropType; + } + + public Document getRevisionInfoXmlMapping() { + return revisionInfoXmlMapping; + } +} \ No newline at end of file Deleted: trunk/src/main/org/jboss/envers/configuration/RevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/RevisionInfoGenerator.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/RevisionInfoGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -1,29 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public interface RevisionInfoGenerator { - public Object newRevision(); -} Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) @@ -25,12 +25,10 @@ import org.hibernate.mapping.PersistentClass; import org.hibernate.MappingException; import org.jboss.envers.configuration.metadata.VersionsMetadataGenerator; -import org.jboss.envers.configuration.metadata.RevisionsInfoMetadataGenerator; import org.jboss.envers.configuration.metadata.AnnotationsMetadataReader; import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; +import org.jboss.envers.configuration.entities.EntitiesConfigurations; import org.jboss.envers.synchronization.VersionsSyncManager; -import org.jboss.envers.mapper.ExtendedPropertyMapper; -import org.jboss.envers.mapper.id.IdMapper; import org.jboss.envers.tools.graph.GraphTopologicalSort; import org.jboss.envers.tools.reflection.YReflectionManager; import org.dom4j.Document; @@ -49,19 +47,13 @@ * @author Adam Warski (adam at warski dot org) */ public class VersionsConfiguration { - private VersionsEntitiesConfiguration verEntCfg; - private VersionsSyncManager versionsSyncManager; - private EntitiesConfigurations entitiesConfigurations; + private final GlobalConfiguration globalCfg; + private final VersionsEntitiesConfiguration verEntCfg; + private final VersionsSyncManager versionsSyncManager; + private final EntitiesConfigurations entCfg; + private final RevisionInfoConfiguration revInfoCfg; - // Should a revision be generated when a not-owned relation field changes - private boolean generateRevisionsForCollections; - - // Should a warning, instead of an error and an exception, be logged, when an unsupported type is versioned - private boolean warnOnUnsupportedTypes; - - // - - public VersionsEntitiesConfiguration getEntitiesCfg() { + public VersionsEntitiesConfiguration getVerEntCfg() { return verEntCfg; } @@ -69,22 +61,16 @@ return versionsSyncManager; } - // todo - private void writeDocument(Document e) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Writer w = new PrintWriter(baos); + public RevisionInfoConfiguration getRevInfoCfg() { + return revInfoCfg; + } - try { - XMLWriter xw = new XMLWriter(w, new OutputFormat(" ", true)); - xw.write(e); - w.flush(); - } catch (IOException e1) { - e1.printStackTrace(); - } + public GlobalConfiguration getGlobalCfg() { + return globalCfg; + } - System.out.println("-----------"); - System.out.println(baos.toString()); - System.out.println("-----------"); + public EntitiesConfigurations getEntCfg() { + return entCfg; } private YReflectionManager getReflectionManager(Configuration cfg) { @@ -95,34 +81,18 @@ } } - private boolean isVersioned(PersistentClassVersioningData versioningData) { - if (versioningData == null) { return false; } - if (versioningData.propertyStoreInfo.propertyStores.size() > 0) { return true; } - if (versioningData.propertyStoreInfo.defaultStore != null) { return true; } - return false; - } - - private void configureFromProperties(Properties properties) { - String generateRevisionsForCollectionsStr = properties.getProperty("org.jboss.envers.revisionOnCollectionChange", - "true"); - generateRevisionsForCollections = Boolean.parseBoolean(generateRevisionsForCollectionsStr); - - String warnOnUnsupportedTypesStr = properties.getProperty("org.jboss.envers.warnOnUnsupportedTypes", - "false"); - warnOnUnsupportedTypes = Boolean.parseBoolean(warnOnUnsupportedTypesStr); - } - @SuppressWarnings({"unchecked"}) - public void configure(Configuration cfg) { - configureFromProperties(cfg.getProperties()); + public VersionsConfiguration(Configuration cfg) { + Properties properties = cfg.getProperties(); YReflectionManager reflectionManager = getReflectionManager(cfg); + revInfoCfg = new RevisionInfoConfiguration(); + RevisionInfoConfigurationResult revInfoCfgResult = revInfoCfg.configure(cfg, reflectionManager); + verEntCfg = new VersionsEntitiesConfiguration(properties, revInfoCfgResult.getRevisionPropType()); + globalCfg = new GlobalConfiguration(properties); + versionsSyncManager = new VersionsSyncManager(revInfoCfgResult.getRevisionNumberGenerator()); - verEntCfg = VersionsEntitiesConfiguration.get(cfg, reflectionManager); - - versionsSyncManager = new VersionsSyncManager(verEntCfg); - - VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(this, verEntCfg); + VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(this); DOMWriter writer = new DOMWriter(); // Sorting the persistent class topologically - superclass always before subclass @@ -140,7 +110,7 @@ PersistentClassVersioningData versioningData = annotationsMetadataReader.getVersioningData(pc, reflectionManager); - if (isVersioned(versioningData)) { + if (versioningData.isVersioned()) { pcDatas.put(pc, versioningData); if (versioningData.versionsTableName != null) { @@ -169,21 +139,13 @@ } // Getting the entities configurations - entitiesConfigurations = new EntitiesConfigurations(versionsMetaGen.getEntitiesConfigurations()); + entCfg = new EntitiesConfigurations(versionsMetaGen.getEntitiesConfigurations()); - // Checking if custom revision entity isn't versioned - if (entitiesConfigurations.get(verEntCfg.getRevisionsInfoEntityName()) != null) { - throw new MappingException("An entity annotated with @RevisionEntity cannot be versioned!"); - } - // Only if there are any versioned classes if (pcDatas.size() > 0) { try { - if (!verEntCfg.hasCustomRevisionInfoEntity()) { - RevisionsInfoMetadataGenerator revisionsMetaGenInfo = new RevisionsInfoMetadataGenerator(verEntCfg); - Document helperEntity = revisionsMetaGenInfo.generate(); - //writeDocument(helperEntity); - cfg.addDocument(writer.write(helperEntity)); + if (revInfoCfgResult.getRevisionInfoXmlMapping() != null) { + cfg.addDocument(writer.write(revInfoCfgResult.getRevisionInfoXmlMapping())); } } catch (DocumentException e) { throw new MappingException(e); @@ -191,38 +153,6 @@ } } - public boolean isVersioned(String entityName) { - return entitiesConfigurations.get(entityName) != null; - } - - public IdMapper getIdMapper(String entityName) { - return entitiesConfigurations.get(entityName).getIdMappingData().getIdMapper(); - } - - public ExtendedPropertyMapper getPropertyMapper(String entityName) { - return entitiesConfigurations.get(entityName).getPropertyMapper(); - } - - public EntityConfiguration getEntityConfiguration(String entityName) { - return entitiesConfigurations.get(entityName); - } - - public String getEntityNameForVersionsEntityName(String versionsEntityName) { - return entitiesConfigurations.getEntityNameForVersionsEntityName(versionsEntityName); - } - - public boolean isGenerateRevisionsForCollections() { - return generateRevisionsForCollections; - } - - public boolean isWarnOnUnsupportedTypes() { - return warnOnUnsupportedTypes; - } - - public RelationDescription getRelationDescription(String entityName, String propertyName) { - return entitiesConfigurations.getRelationDescription(entityName, propertyName); - } - // private static Map cfgs @@ -232,13 +162,30 @@ VersionsConfiguration verCfg = cfgs.get(cfg); if (verCfg == null) { - verCfg = new VersionsConfiguration(); + verCfg = new VersionsConfiguration(cfg); cfgs.put(cfg, verCfg); - - verCfg.configure(cfg); + cfg.buildMappings(); } return verCfg; } + + // todo + private void writeDocument(Document e) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Writer w = new PrintWriter(baos); + + try { + XMLWriter xw = new XMLWriter(w, new OutputFormat(" ", true)); + xw.write(e); + w.flush(); + } catch (IOException e1) { + e1.printStackTrace(); + } + + System.out.println("-----------"); + System.out.println(baos.toString()); + System.out.println("-----------"); + } } Modified: trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) @@ -21,75 +21,42 @@ */ package org.jboss.envers.configuration; -import org.hibernate.cfg.Configuration; -import org.hibernate.mapping.PersistentClass; -import org.hibernate.MappingException; -import org.jboss.envers.RevisionEntity; -import org.jboss.envers.RevisionNumber; -import org.jboss.envers.RevisionTimestamp; -import org.jboss.envers.tools.reflection.YReflectionManager; -import org.jboss.envers.tools.reflection.YClass; -import org.jboss.envers.tools.reflection.YProperty; -import org.jboss.envers.tools.MutableBoolean; - import java.util.*; /** - * Configuration of versions entities - names of fields and entities created to store versioning information, revision - * info entity configuration etc. + * Configuration of versions entities - names of fields, entities and tables created to store versioning information. * @author Adam Warski (adam at warski dot org) */ public class VersionsEntitiesConfiguration { - private String versionsTablePrefix; - private String versionsTableSuffix; + private final String versionsTablePrefix; + private final String versionsTableSuffix; - private String originalIdPropName; + private final String originalIdPropName; - private String revisionPropName; - private String revisionPropType; - private String revisionPropPath; + private final String revisionPropName; + private final String revisionPropType; + private final String revisionPropPath; - private String revisionTypePropName; - private String revisionTypePropType; + private final String revisionTypePropName; + private final String revisionTypePropType; - private String revisionsInfoEntityName; - private String revisionsInfoIdName; - private String revisionsInfoTimestampName; - private String revisionsInfoTimestampType; - private boolean customRevisionsInfoEntity; + private final Map customVersionsTablesNames; - private RevisionInfoGenerator revisionInfoGenerator; + public VersionsEntitiesConfiguration(Properties properties, String revisionPropType) { + versionsTablePrefix = properties.getProperty("org.jboss.envers.versionsTablePrefix", ""); + versionsTableSuffix = properties.getProperty("org.jboss.envers.versionsTableSuffix", "_versions"); - private Map customVersionsTablesNames; + originalIdPropName = "originalId"; - public static VersionsEntitiesConfiguration get(Configuration cfg, YReflectionManager reflectionManager) { - Properties properties = cfg.getProperties(); + revisionPropName = properties.getProperty("org.jboss.envers.revisionFieldName", "_revision"); + this.revisionPropType = revisionPropType; - VersionsEntitiesConfiguration verEntCfg = new VersionsEntitiesConfiguration(); + revisionTypePropName = properties.getProperty("org.jboss.envers.revisionTypeFieldName", "_revision_type"); + revisionTypePropType = "byte"; - verEntCfg.versionsTablePrefix = properties.getProperty("org.jboss.envers.versionsTablePrefix", ""); - verEntCfg.versionsTableSuffix = properties.getProperty("org.jboss.envers.versionsTableSuffix", "_versions"); + customVersionsTablesNames = new HashMap(); - verEntCfg.originalIdPropName = "originalId"; - - verEntCfg.revisionPropName = properties.getProperty("org.jboss.envers.revisionFieldName", "_revision"); - verEntCfg.revisionPropType = "integer"; - - verEntCfg.revisionTypePropName = properties.getProperty("org.jboss.envers.revisionTypeFieldName", "_revision_type"); - verEntCfg.revisionTypePropType = "byte"; - - verEntCfg.revisionsInfoEntityName = "_revisions_info"; - verEntCfg.revisionsInfoIdName = "revision_id"; - verEntCfg.revisionsInfoTimestampName = "revision_timestamp"; - verEntCfg.revisionsInfoTimestampType = "long"; - - verEntCfg.customVersionsTablesNames = new HashMap(); - - verEntCfg.revisionPropPath = verEntCfg.originalIdPropName + "." + verEntCfg.revisionPropName; - - verEntCfg.customRevisionsInfoEntity = verEntCfg.configureRevisionsEntity(cfg, reflectionManager); - - return verEntCfg; + revisionPropPath = originalIdPropName + "." + revisionPropName; } public String getVersionsTablePrefix() { @@ -124,26 +91,6 @@ return revisionTypePropType; } - public String getRevisionsInfoEntityName() { - return revisionsInfoEntityName; - } - - public String getRevisionsInfoIdName() { - return revisionsInfoIdName; - } - - public String getRevisionsInfoTimestampName() { - return revisionsInfoTimestampName; - } - - public String getRevisionsInfoTimestampType() { - return revisionsInfoTimestampType; - } - - public RevisionInfoGenerator getRevisionInfoGenerator() { - return revisionInfoGenerator; - } - // public void addCustomVersionsTableName(String entityName, String tableName) { @@ -173,117 +120,4 @@ return customHistoryTableName; } - - public boolean isRevisionInfoEntityName(String entityName) { - return revisionsInfoEntityName.equals(entityName); - } - - public boolean hasCustomRevisionInfoEntity() { - return customRevisionsInfoEntity; - } - - // - - private void searchForRevisionInfoCfg(YClass clazz, YReflectionManager reflectionManager, - MutableBoolean revisionNumberFound, MutableBoolean revisionTimestampFound) { - YClass superclazz = clazz.getSuperclass(); - if (!"java.lang.Object".equals(superclazz.getName())) { - searchForRevisionInfoCfg(superclazz, reflectionManager, revisionNumberFound, revisionTimestampFound); - } - - for (YProperty property : clazz.getDeclaredProperties("field")) { - RevisionNumber revisionNumber = property.getAnnotation(RevisionNumber.class); - RevisionTimestamp revisionTimestamp = property.getAnnotation(RevisionTimestamp.class); - - if (revisionNumber != null) { - if (revisionNumberFound.isSet()) { - throw new MappingException("Only one property may be annotated with @RevisionNumber!"); - } - - YClass revisionNumberClass = property.getType(); - if (reflectionManager.equals(revisionNumberClass, Integer.class) || - reflectionManager.equals(revisionNumberClass, Integer.TYPE)) { - revisionsInfoIdName = property.getName(); - revisionNumberFound.set(); - } else if (reflectionManager.equals(revisionNumberClass, Long.class) || - reflectionManager.equals(revisionNumberClass, Long.TYPE)) { - revisionsInfoIdName = property.getName(); - revisionNumberFound.set(); - - // The default is integer - revisionPropType = "long"; - } else { - throw new MappingException("The field annotated with @RevisionNumber must be of type " + - "int, Integer, long or Long"); - } - } - - if (revisionTimestamp != null) { - if (revisionTimestampFound.isSet()) { - throw new MappingException("Only one property may be annotated with @RevisionTimestamp!"); - } - - YClass revisionTimestampClass = property.getType(); - if (reflectionManager.equals(revisionTimestampClass, Long.class) || - reflectionManager.equals(revisionTimestampClass, Long.TYPE)) { - revisionsInfoTimestampName = property.getName(); - revisionTimestampFound.set(); - } else { - throw new MappingException("The field annotated with @RevisionTimestamp must be of type " + - "long or Long"); - } - } - } - } - - @SuppressWarnings({"unchecked"}) - private boolean configureRevisionsEntity(Configuration cfg, YReflectionManager reflectionManager) { - Iterator classes = (Iterator) cfg.getClassMappings(); - boolean revisionEntityFound = false; - - while (classes.hasNext()) { - PersistentClass pc = classes.next(); - YClass clazz; - try { - clazz = reflectionManager.classForName(pc.getClassName(), this.getClass()); - } catch (ClassNotFoundException e) { - throw new MappingException(e); - } - - RevisionEntity revisionEntity = clazz.getAnnotation(RevisionEntity.class); - if (revisionEntity != null) { - if (revisionEntityFound) { - throw new MappingException("Only one entity may be annotated with @RevisionEntity!"); - } - - revisionEntityFound = true; - - MutableBoolean revisionNumberFound = new MutableBoolean(); - MutableBoolean revisionTimestampFound = new MutableBoolean(); - - searchForRevisionInfoCfg(clazz, reflectionManager, revisionNumberFound, revisionTimestampFound); - - if (!revisionNumberFound.isSet()) { - throw new MappingException("An entity annotated with @RevisionEntity must have a field annotated " + - "with @RevisionNumber!"); - } - - if (!revisionTimestampFound.isSet()) { - throw new MappingException("An entity annotated with @RevisionEntity must have a field annotated " + - "with @RevisionTimestamp!"); - } - - revisionsInfoEntityName = pc.getEntityName(); - - revisionInfoGenerator = new CustomRevisionInfoGenerator(this, pc.getMappedClass(), - revisionEntity.value()); - } - } - - if (revisionInfoGenerator == null) { - revisionInfoGenerator = new DefaultRevisionInfoGenerator(this); - } - - return revisionEntityFound; - } } Copied: trunk/src/main/org/jboss/envers/configuration/entities/EntitiesConfigurations.java (from rev 102, trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurations.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/entities/EntitiesConfigurations.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/entities/EntitiesConfigurations.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,110 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.entities; + +import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.mapper.ExtendedPropertyMapper; +import org.jboss.envers.configuration.RelationDescription; + +import java.util.Map; +import java.util.HashMap; + +/** + * Configuration of the user entities: property mapping of the entities, relations, inheritance. + * @author Adam Warski (adam at warski dot org) + */ +public class EntitiesConfigurations { + private Map entitiesConfigurations; + + // Map versions entity name -> entity name + private Map entityNamesForVersionsEntityNames = new HashMap(); + + public EntitiesConfigurations(Map entitiesConfigurations) { + this.entitiesConfigurations = entitiesConfigurations; + + generateBidirectionRelationInfo(); + generateVersionsEntityToEntityNames(); + } + + private void generateVersionsEntityToEntityNames() { + entityNamesForVersionsEntityNames = new HashMap(); + + for (String entityName : entitiesConfigurations.keySet()) { + entityNamesForVersionsEntityNames.put(entitiesConfigurations.get(entityName).getVersionsEntityName(), + entityName); + } + } + + private void generateBidirectionRelationInfo() { + // Checking each relation if it is bidirectional. If so, storing that information. + for (String entityName : entitiesConfigurations.keySet()) { + EntityConfiguration entCfg = entitiesConfigurations.get(entityName); + // Iterating over all relations from that entity + for (RelationDescription relDesc : entCfg.getRelationsIterator()) { + // If this is an "owned" relation, checking the related entity, if it has a relation that has + // a mapped-by attribute to the currently checked. If so, this is a bidirectional relation. + if (relDesc.relationType == RelationDescription.RelationType.TO_ONE) { + for (RelationDescription other : entitiesConfigurations.get(relDesc.toEntityName).getRelationsIterator()) { + if (relDesc.fromPropertyName.equals(other.mappedByPropertyName) && + (entityName.equals(other.toEntityName))) { + relDesc.bidirectional = true; + other.bidirectional= true; + } + } + } + } + } + } + + public EntityConfiguration get(String entityName) { + return entitiesConfigurations.get(entityName); + } + + public String getEntityNameForVersionsEntityName(String versionsEntityName) { + return entityNamesForVersionsEntityNames.get(versionsEntityName); + } + + public boolean isVersioned(String entityName) { + return get(entityName) != null; + } + + public IdMapper getIdMapper(String entityName) { + return get(entityName).getIdMappingData().getIdMapper(); + } + + public ExtendedPropertyMapper getPropertyMapper(String entityName) { + return get(entityName).getPropertyMapper(); + } + + public RelationDescription getRelationDescription(String entityName, String propertyName) { + EntityConfiguration entCfg = entitiesConfigurations.get(entityName); + RelationDescription relDesc = entCfg.getRelationDescription(propertyName); + if (relDesc != null) { + return relDesc; + } else if (entCfg.getParentEntityName() != null) { + // The field may be declared in a superclass ... + return getRelationDescription(entCfg.getParentEntityName(), propertyName); + } else { + return null; + } + } +} Copied: trunk/src/main/org/jboss/envers/configuration/entities/EntityConfiguration.java (from rev 103, trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/entities/EntityConfiguration.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/entities/EntityConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,102 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.entities; + +import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.mapper.ExtendedPropertyMapper; +import org.jboss.envers.mapper.id.IdMapper; + +import java.util.Map; +import java.util.HashMap; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class EntityConfiguration { + private String entityName; + private String versionsEntityName; + private IdMappingData idMappingData; + private ExtendedPropertyMapper propertyMapper; + // Maps from property name + private Map relations; + private String parentEntityName; + + public EntityConfiguration(String entityName, String versionsEntityName, IdMappingData idMappingData, + ExtendedPropertyMapper propertyMapper, String parentEntityName) { + this.entityName = entityName; + this.versionsEntityName = versionsEntityName; + this.idMappingData = idMappingData; + this.propertyMapper = propertyMapper; + this.parentEntityName = parentEntityName; + + this.relations = new HashMap(); + } + + public void addToOneRelation(String fromPropertyName, String toEntityName, IdMapper idMapper) { + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.TO_ONE, + toEntityName, null, idMapper)); + } + + public void addOneToOneRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, + IdMapper idMapper) { + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.ONE_TO_ONE, + toEntityName, mappedByPropertyName, idMapper)); + } + + public void addOneToManyRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, + IdMapper idMapper) { + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.ONE_TO_MANY, + toEntityName, mappedByPropertyName, idMapper)); + } + + public boolean isRelation(String propertyName) { + return relations.get(propertyName) != null; + } + + public Iterable getRelationsIterator() { + return relations.values(); + } + + public RelationDescription getRelationDescription(String propertyName) { + return relations.get(propertyName); + } + + public IdMappingData getIdMappingData() { + return idMappingData; + } + + public ExtendedPropertyMapper getPropertyMapper() { + return propertyMapper; + } + + public String getParentEntityName() { + return parentEntityName; + } + + public String getEntityName() { + return entityName; + } + + public String getVersionsEntityName() { + return versionsEntityName; + } +} Copied: trunk/src/main/org/jboss/envers/configuration/entities/IdMappingData.java (from rev 103, trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/entities/IdMappingData.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/entities/IdMappingData.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,54 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.entities; + +import org.jboss.envers.mapper.id.IdMapper; +import org.dom4j.Element; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class IdMappingData { + private IdMapper idMapper; + // Mapping which will be used to generate the entity + private Element xmlMapping; + // Mapping which will be used to generate references to the entity in related entities + private Element xmlRelationMapping; + + public IdMappingData(IdMapper idMapper, Element xmlMapping, Element xmlRelationMapping) { + this.idMapper = idMapper; + this.xmlMapping = xmlMapping; + this.xmlRelationMapping = xmlRelationMapping; + } + + public IdMapper getIdMapper() { + return idMapper; + } + + public Element getXmlMapping() { + return xmlMapping; + } + + public Element getXmlRelationMapping() { + return xmlRelationMapping; + } +} Modified: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-14 15:39:48 UTC (rev 104) @@ -59,12 +59,12 @@ } public PersistentClassVersioningData getVersioningData(PersistentClass pc, YReflectionManager reflectionManager) { + PersistentClassVersioningData versioningData = new PersistentClassVersioningData(); + if (pc.getClassName() == null) { - return null; + return versioningData; } - PersistentClassVersioningData versioningData = new PersistentClassVersioningData(); - try { YClass clazz = reflectionManager.classForName(pc.getClassName(), this.getClass()); Versioned defaultVersioned = clazz.getAnnotation(Versioned.class); Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/metadata/RevisionsInfoMetadataGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -1,53 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration.metadata; - -import org.dom4j.Document; -import org.dom4j.DocumentHelper; -import org.dom4j.Element; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class RevisionsInfoMetadataGenerator { - private VersionsEntitiesConfiguration verEntCfg; - - public RevisionsInfoMetadataGenerator(VersionsEntitiesConfiguration verEntCfg) { - this.verEntCfg = verEntCfg; - } - - public Document generate() { - Document document = DocumentHelper.createDocument(); - - Element class_mapping = MetadataTools.createEntity(document, verEntCfg.getRevisionsInfoEntityName(), - null, null, null, null); - - MetadataTools.addNativelyGeneratedId(class_mapping, verEntCfg.getRevisionsInfoIdName(), - verEntCfg.getRevisionPropType()); - - MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionsInfoTimestampName(), - verEntCfg.getRevisionsInfoTimestampType(), false); - - return document; - } -} Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -30,8 +30,8 @@ import org.dom4j.DocumentHelper; import org.dom4j.Attribute; import org.dom4j.tree.DefaultElement; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; -import org.jboss.envers.configuration.EntityConfiguration; +import org.jboss.envers.configuration.entities.EntityConfiguration; +import org.jboss.envers.configuration.entities.IdMappingData; import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.mapper.*; import org.jboss.envers.mapper.id.*; @@ -44,7 +44,6 @@ import org.jboss.envers.ModificationStore; import org.jboss.envers.tools.log.YLog; import org.jboss.envers.tools.log.YLogManager; -import org.jboss.envers.configuration.metadata.data.IdMappingData; import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; import org.jboss.envers.configuration.metadata.data.PropertyStoreInfo; import org.jboss.envers.exception.VersionsException; @@ -61,7 +60,6 @@ private final static Map EMPTY_STORE = Collections.emptyMap(); private VersionsConfiguration verCfg; - private VersionsEntitiesConfiguration verEntCfg; private Map entitiesConfigurations; // Map entity name -> (join descriptor -> element describing the "versioned" join) @@ -69,9 +67,8 @@ private YLog log = YLogManager.getLogManager().getLog(VersionsMetadataGenerator.class); - public VersionsMetadataGenerator(VersionsConfiguration verCfg, VersionsEntitiesConfiguration verEntCfg) { + public VersionsMetadataGenerator(VersionsConfiguration verCfg) { this.verCfg = verCfg; - this.verEntCfg = verEntCfg; entitiesConfigurations = new HashMap(); entitiesJoins = new HashMap>(); @@ -428,7 +425,7 @@ } else { String message = "Type not supported for versioning: " + propertyType.getClass().getName() + ", on entity " + entityName + ", property '" + property.getName() + "'."; - if (verCfg.isWarnOnUnsupportedTypes()) { + if (verCfg.getGlobalCfg().isWarnOnUnsupportedTypes()) { log.warn(message); } else { throw new MappingException(message); @@ -454,7 +451,7 @@ String originalTableName = join.getTable().getName(); String versionedTableName = versioningData.secondaryTableDictionary.get(originalTableName); if (versionedTableName == null) { - versionedTableName = verEntCfg.getVersionsEntityName(originalTableName); + versionedTableName = verCfg.getVerEntCfg().getVersionsEntityName(originalTableName); } String schema = versioningData.schema; @@ -472,7 +469,7 @@ Element joinKey = joinElement.addElement("key"); addColumns(joinKey, join.getKey().getColumnIterator()); - MetadataTools.addColumn(joinKey, verEntCfg.getRevisionPropName(), null); + MetadataTools.addColumn(joinKey, verCfg.getVerEntCfg().getRevisionPropName(), null); } } @@ -524,12 +521,12 @@ addSimpleProperty(orig_id_mapping, id_prop, null, ModificationStore.FULL, true); } - orig_id_mapping.addAttribute("name", verEntCfg.getOriginalIdPropName()); + orig_id_mapping.addAttribute("name", verCfg.getVerEntCfg().getOriginalIdPropName()); // Adding the "revision number" property - Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verEntCfg.getRevisionPropName(), - verEntCfg.getRevisionPropType(), true); - MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); + Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verCfg.getVerEntCfg().getRevisionPropName(), + verCfg.getVerEntCfg().getRevisionPropType(), true); + MetadataTools.addColumn(rev_mapping, verCfg.getVerEntCfg().getRevisionPropName(), null); return new IdMappingData(mapper, orig_id_mapping, rel_id_mapping); } @@ -560,8 +557,8 @@ } String entityName = pc.getEntityName(); - String versionsEntityName = verEntCfg.getVersionsEntityName(entityName); - String versionsTableName = verEntCfg.getVersionsTableName(entityName, pc.getTable().getName()); + String versionsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(entityName); + String versionsTableName = verCfg.getVerEntCfg().getVersionsTableName(entityName, pc.getTable().getName()); // Generating a mapping for the id IdMappingData idMapper = addId(pc); @@ -592,13 +589,13 @@ class_mapping.add((Element) idMapper.getXmlMapping().clone()); // Adding the "revision type" property - Element revTypeProperty = MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionTypePropName(), - verEntCfg.getRevisionTypePropType(), false); + Element revTypeProperty = MetadataTools.addProperty(class_mapping, verCfg.getVerEntCfg().getRevisionTypePropName(), + verCfg.getVerEntCfg().getRevisionTypePropType(), false); revTypeProperty.addAttribute("type", "org.jboss.envers.entity.RevisionTypeType"); break; case SINGLE: - String extendsEntityName = verEntCfg.getVersionsEntityName(pc.getSuperclass().getEntityName()); + String extendsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(pc.getSuperclass().getEntityName()); class_mapping = MetadataTools.createSubclassEntity(document, versionsEntityName, versionsTableName, schema, catalog, extendsEntityName, pc.getDiscriminatorValue()); Modified: trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java 2008-08-14 15:39:48 UTC (rev 104) @@ -40,4 +40,10 @@ public String schema; public String catalog; public Map secondaryTableDictionary; + + public boolean isVersioned() { + if (propertyStoreInfo.propertyStores.size() > 0) { return true; } + if (propertyStoreInfo.defaultStore != null) { return true; } + return false; + } } Modified: trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java =================================================================== --- trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -57,7 +57,7 @@ } // The $type$ property holds the name of the (versions) entity - String type = verCfg.getEntityNameForVersionsEntityName((String) versionsEntity.get("$type$")); + String type = verCfg.getEntCfg().getEntityNameForVersionsEntityName((String) versionsEntity.get("$type$")); if (type != null) { entityName = type; @@ -71,12 +71,12 @@ throw new VersionsException(e); } - IdMapper idMapper = verCfg.getIdMapper(entityName); - Map originalId = (Map) versionsEntity.get(verCfg.getEntitiesCfg().getOriginalIdPropName()); + IdMapper idMapper = verCfg.getEntCfg().getIdMapper(entityName); + Map originalId = (Map) versionsEntity.get(verCfg.getVerEntCfg().getOriginalIdPropName()); Object primaryKey = idMapper.mapToIdFromMap(originalId); - verCfg.getPropertyMapper(entityName).mapToEntityFromMap(ret, versionsEntity, primaryKey, versionsReader, revision); + verCfg.getEntCfg().getPropertyMapper(entityName).mapToEntityFromMap(ret, versionsEntity, primaryKey, versionsReader, revision); idMapper.mapToEntityFromMap(ret, originalId); return ret; Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-14 15:39:48 UTC (rev 104) @@ -46,7 +46,7 @@ private void generateCollectionChangeWorkUnits(VersionsSync verSync, EntityPersister entityPersister, String entityName, Object[] newState, Object[] oldState) { // Checking if this is enabled in configuration ... - if (!verCfg.isGenerateRevisionsForCollections()) { + if (!verCfg.getGlobalCfg().isGenerateRevisionsForCollections()) { return; } @@ -57,14 +57,14 @@ for (int i=0; i T find(Class cls, Object primaryKey, Number revision) throws IllegalArgumentException, NotVersionedException, IllegalStateException { @@ -91,7 +89,7 @@ String entityName = cls.getName(); - if (!verCfg.isVersioned(entityName)) { + if (!verCfg.getEntCfg().isVersioned(entityName)) { throw new NotVersionedException(entityName + " is not versioned!"); } @@ -150,7 +148,7 @@ String entityName = cls.getName(); - if (!verCfg.isVersioned(entityName)) { + if (!verCfg.getEntCfg().isVersioned(entityName)) { throw new NotVersionedException(entityName + " is not versioned!"); } @@ -167,9 +165,9 @@ checkSession(); StringBuilder queryStr = new StringBuilder(); - queryStr.append("select rev.").append(entitiesCfg.getRevisionsInfoTimestampName()) - .append(" from ").append(entitiesCfg.getRevisionsInfoEntityName()) - .append(" rev where ").append(entitiesCfg.getRevisionsInfoIdName()).append(" = :_revision_number"); + queryStr.append("select rev.").append(revInfoCfg.getRevisionInfoTimestampName()) + .append(" from ").append(revInfoCfg.getRevisionInfoEntityName()) + .append(" rev where ").append(revInfoCfg.getRevisionInfoIdName()).append(" = :_revision_number"); Query query = session.createQuery(queryStr.toString()).setParameter("_revision_number", revision); @@ -190,9 +188,9 @@ checkSession(); StringBuilder queryStr = new StringBuilder(); - queryStr.append("select max(rev.").append(entitiesCfg.getRevisionsInfoIdName()) - .append(") from ").append(entitiesCfg.getRevisionsInfoEntityName()) - .append(" rev where ").append(entitiesCfg.getRevisionsInfoTimestampName()).append(" <= :_revision_date"); + queryStr.append("select max(rev.").append(revInfoCfg.getRevisionInfoIdName()) + .append(") from ").append(revInfoCfg.getRevisionInfoEntityName()) + .append(" rev where ").append(revInfoCfg.getRevisionInfoTimestampName()).append(" <= :_revision_date"); Query query = session.createQuery(queryStr.toString()).setParameter("_revision_date", date.getTime()); @@ -217,9 +215,9 @@ StringBuilder queryStr = new StringBuilder(); queryStr.append("select rev from ") - .append(entitiesCfg.getRevisionsInfoEntityName()) + .append(revInfoCfg.getRevisionInfoEntityName()) .append(" rev where ") - .append(entitiesCfg.getRevisionsInfoIdName()) + .append(revInfoCfg.getRevisionInfoIdName()) .append(" = :_revision_number"); Query query = session.createQuery(queryStr.toString()).setParameter("_revision_number", revision); Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-14 15:39:48 UTC (rev 104) @@ -25,7 +25,6 @@ import org.hibernate.Session; import org.jboss.envers.VersionsReader; import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; import java.util.Collection; @@ -45,6 +44,4 @@ Class collectionClass); VersionsConfiguration getVerCfg(); - - VersionsEntitiesConfiguration getEntitiesCfg(); } Added: trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,72 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.revisioninfo; + +import org.jboss.envers.RevisionListener; +import org.jboss.envers.tools.reflection.ReflectionTools; +import org.hibernate.MappingException; +import org.hibernate.property.Setter; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class CustomRevisionInfoGenerator implements RevisionInfoGenerator { + private RevisionListener listener; + private Setter revisionTimestampSetter; + private Class entityClass; + + public CustomRevisionInfoGenerator(Class entityClass, + Class listenerClass, + String revisionInfoTimestampName) { + this.entityClass = entityClass; + + revisionTimestampSetter = ReflectionTools.getSetter(entityClass, revisionInfoTimestampName); + + if (!listenerClass.equals(RevisionListener.class)) { + // This is not the default value. + try { + listener = listenerClass.newInstance(); + } catch (InstantiationException e) { + throw new MappingException(e); + } catch (IllegalAccessException e) { + throw new MappingException(e); + } + } + } + + public Object newRevision() { + Object entity; + try { + entity = entityClass.newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + revisionTimestampSetter.set(entity, System.currentTimeMillis(), null); + + if (listener != null) { + listener.newRevision(entity); + } + + return entity; + } +} Added: trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,43 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.revisioninfo; + +import java.util.Map; +import java.util.HashMap; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DefaultRevisionInfoGenerator implements RevisionInfoGenerator { + private String revisionInfoTimestampName; + + public DefaultRevisionInfoGenerator(String revisionInfoTimestampName) { + this.revisionInfoTimestampName = revisionInfoTimestampName; + } + + public Object newRevision() { + Map revisionInfo = new HashMap(); + revisionInfo.put(revisionInfoTimestampName, System.currentTimeMillis()); + + return revisionInfo; + } +} Added: trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,29 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.revisioninfo; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public interface RevisionInfoGenerator { + public Object newRevision(); +} Added: trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java 2008-08-14 15:39:48 UTC (rev 104) @@ -0,0 +1,20 @@ +package org.jboss.envers.revisioninfo; + +import org.hibernate.Session; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionNumberGenerator { + private final String revisionInfoEntityName; + private final RevisionInfoGenerator revisionInfoGenerator; + + public RevisionNumberGenerator(String revisionInfoEntityName, RevisionInfoGenerator revisionInfoGenerator) { + this.revisionInfoEntityName = revisionInfoEntityName; + this.revisionInfoGenerator = revisionInfoGenerator; + } + + public Number generate(Session session) { + return (Number) session.save(revisionInfoEntityName, revisionInfoGenerator.newRevision()); + } +} Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-14 15:39:48 UTC (rev 104) @@ -26,6 +26,7 @@ import org.hibernate.FlushMode; import org.jboss.envers.synchronization.work.VersionsWorkUnit; import org.jboss.envers.tools.Pair; +import org.jboss.envers.revisioninfo.RevisionNumberGenerator; import javax.transaction.Synchronization; import java.util.*; @@ -34,29 +35,28 @@ * @author Adam Warski (adam at warski dot org) */ public class VersionsSync implements Synchronization { - private VersionsSyncManager manager; - private Session session; + private final RevisionNumberGenerator revisionNumberGenerator; + private final VersionsSyncManager manager; + private final Session session; + + private final Transaction transaction; + private final LinkedList workUnits; + private final Queue undoQueue; + private final Map, VersionsWorkUnit> usedIds; + private Number revision; - private Transaction transaction; - private LinkedList workUnits; - private Queue undoQueue; - private Map, VersionsWorkUnit> usedIds; - public VersionsSync(VersionsSyncManager manager, Session session) { + public VersionsSync(VersionsSyncManager manager, Session session, RevisionNumberGenerator revisionNumberGenerator) { this.manager = manager; this.session = session; + this.revisionNumberGenerator = revisionNumberGenerator; transaction = session.getTransaction(); workUnits = new LinkedList(); undoQueue = new LinkedList(); usedIds = new HashMap, VersionsWorkUnit>(); } - - private void generateRevision(Session session) { - revision = (Number) session.save(manager.getEntitiesCfg().getRevisionsInfoEntityName(), - manager.getEntitiesCfg().getRevisionInfoGenerator().newRevision()); - } - + private void removeWorkUnit(VersionsWorkUnit vwu) { workUnits.remove(vwu); if (vwu.isPerformed()) { @@ -98,7 +98,7 @@ private void executeInSession(Session session) { if (revision == null) { - generateRevision(session); + revision = revisionNumberGenerator.generate(session); } VersionsWorkUnit vwu; @@ -121,6 +121,7 @@ if (FlushMode.isManualFlushMode(session.getFlushMode())) { Session temporarySession = null; try { + //noinspection deprecation temporarySession = session.getSessionFactory().openSession(session.connection()); executeInSession(temporarySession); Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java 2008-08-14 15:39:48 UTC (rev 104) @@ -22,7 +22,7 @@ package org.jboss.envers.synchronization; import org.jboss.envers.tools.ConcurrentReferenceHashMap; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.revisioninfo.RevisionNumberGenerator; import org.hibernate.Session; import org.hibernate.Transaction; @@ -32,19 +32,15 @@ * @author Adam Warski (adam at warski dot org) */ public class VersionsSyncManager { - private VersionsEntitiesConfiguration verEntCfg; - private Map versionsSyncs; + private final Map versionsSyncs; + private final RevisionNumberGenerator revisionNumberGenerator; - public VersionsSyncManager(VersionsEntitiesConfiguration verEntCfg) { - this.verEntCfg = verEntCfg; - + public VersionsSyncManager(RevisionNumberGenerator revisionNumberGenerator) { versionsSyncs = new ConcurrentReferenceHashMap(10, ConcurrentReferenceHashMap.ReferenceType.WEAK, ConcurrentReferenceHashMap.ReferenceType.STRONG); - } - public VersionsEntitiesConfiguration getEntitiesCfg() { - return verEntCfg; + this.revisionNumberGenerator = revisionNumberGenerator; } public VersionsSync get(Session session) { @@ -52,7 +48,7 @@ VersionsSync verSync = versionsSyncs.get(transaction); if (verSync == null) { - verSync = new VersionsSync(this, session); + verSync = new VersionsSync(this, session, revisionNumberGenerator); versionsSyncs.put(transaction, verSync); transaction.registerSynchronization(verSync); Modified: trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java 2008-08-14 15:39:48 UTC (rev 104) @@ -47,12 +47,12 @@ } protected void fillDataWithId(Map data, Number revision, RevisionType revisionType) { - VersionsEntitiesConfiguration entitiesCfg = verCfg.getEntitiesCfg(); + VersionsEntitiesConfiguration entitiesCfg = verCfg.getVerEntCfg(); Map originalId = new HashMap(); originalId.put(entitiesCfg.getRevisionPropName(), revision); - verCfg.getIdMapper(getEntityName()).mapToMapFromId(originalId, id); + verCfg.getEntCfg().getIdMapper(getEntityName()).mapToMapFromId(originalId, id); data.put(entitiesCfg.getRevisionTypePropName(), revisionType); data.put(entitiesCfg.getOriginalIdPropName(), originalId); } @@ -75,7 +75,7 @@ public void undo(Session session) { if (isPerformed()) { - session.delete(verCfg.getEntitiesCfg().getVersionsEntityName(getEntityName()), performedData); + session.delete(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), performedData); session.flush(); } } Modified: trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-14 15:39:48 UTC (rev 104) @@ -53,9 +53,9 @@ Map data = new HashMap(); fillDataWithId(data, revision, RevisionType.ADD); - verCfg.getPropertyMapper(getEntityName()).map(data, propertyNames, state, null); + verCfg.getEntCfg().getPropertyMapper(getEntityName()).map(data, propertyNames, state, null); - session.save(verCfg.getEntitiesCfg().getVersionsEntityName(getEntityName()), data); + session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); setPerformed(data); } Modified: trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-14 15:39:48 UTC (rev 104) @@ -49,9 +49,9 @@ Map data = new HashMap(); fillDataWithId(data, revision, RevisionType.MOD); - verCfg.getPropertyMapper(getEntityName()).mapToMapFromEntity(data, entity, null); + verCfg.getEntCfg().getPropertyMapper(getEntityName()).mapToMapFromEntity(data, entity, null); - session.save(verCfg.getEntitiesCfg().getVersionsEntityName(getEntityName()), data); + session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); setPerformed(data); } Modified: trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-14 15:39:48 UTC (rev 104) @@ -45,7 +45,7 @@ Map data = new HashMap(); fillDataWithId(data, revision, RevisionType.DEL); - session.save(verCfg.getEntitiesCfg().getVersionsEntityName(getEntityName()), data); + session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); setPerformed(data); } Modified: trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-14 11:12:23 UTC (rev 103) +++ trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-14 15:39:48 UTC (rev 104) @@ -42,7 +42,7 @@ super(entityName, verCfg, id); data = new HashMap(); - changes = verCfg.getPropertyMapper(getEntityName()).map(data, entityPersister.getPropertyNames(), + changes = verCfg.getEntCfg().getPropertyMapper(getEntityName()).map(data, entityPersister.getPropertyNames(), newState, oldState); } @@ -53,7 +53,7 @@ public void perform(Session session, Number revision) { fillDataWithId(data, revision, RevisionType.MOD); - session.save(verCfg.getEntitiesCfg().getVersionsEntityName(getEntityName()), data); + session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); setPerformed(data); } From jboss-envers-commits at lists.jboss.org Fri Aug 15 09:27:22 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Fri, 15 Aug 2008 09:27:22 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r105 - in trunk/src/main/org/jboss/envers: configuration/metadata/data and 2 other directories. Message-ID: Author: adamw Date: 2008-08-15 09:27:21 -0400 (Fri, 15 Aug 2008) New Revision: 105 Added: trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java Removed: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurations.java trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java Modified: trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java Log: ENVERS-37: componentizing configuration - factoring out creating revision queries Deleted: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurations.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurations.java 2008-08-14 15:39:48 UTC (rev 104) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurations.java 2008-08-15 13:27:21 UTC (rev 105) @@ -1,94 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration; - -import java.util.Map; -import java.util.HashMap; - -/** - * Configuration of the user entities: property mapping of the entities, relations, inheritance. - * @author Adam Warski (adam at warski dot org) - */ -public class EntitiesConfigurations { - private Map entitiesConfigurations; - - // Map versions entity name -> entity name - private Map entityNamesForVersionsEntityNames = new HashMap(); - - public EntitiesConfigurations(Map entitiesConfigurations) { - this.entitiesConfigurations = entitiesConfigurations; - - generateBidirectionRelationInfo(); - generateVersionsEntityToEntityNames(); - } - - private void generateVersionsEntityToEntityNames() { - entityNamesForVersionsEntityNames = new HashMap(); - - for (String entityName : entitiesConfigurations.keySet()) { - entityNamesForVersionsEntityNames.put(entitiesConfigurations.get(entityName).getVersionsEntityName(), - entityName); - } - } - - private void generateBidirectionRelationInfo() { - // Checking each relation if it is bidirectional. If so, storing that information. - for (String entityName : entitiesConfigurations.keySet()) { - EntityConfiguration entCfg = entitiesConfigurations.get(entityName); - // Iterating over all relations from that entity - for (RelationDescription relDesc : entCfg.getRelationsIterator()) { - // If this is an "owned" relation, checking the related entity, if it has a relation that has - // a mapped-by attribute to the currently checked. If so, this is a bidirectional relation. - if (relDesc.relationType == RelationDescription.RelationType.TO_ONE) { - for (RelationDescription other : entitiesConfigurations.get(relDesc.toEntityName).getRelationsIterator()) { - if (relDesc.fromPropertyName.equals(other.mappedByPropertyName) && - (entityName.equals(other.toEntityName))) { - relDesc.bidirectional = true; - other.bidirectional= true; - } - } - } - } - } - } - - public EntityConfiguration get(String entityName) { - return entitiesConfigurations.get(entityName); - } - - public String getEntityNameForVersionsEntityName(String versionsEntityName) { - return entityNamesForVersionsEntityNames.get(versionsEntityName); - } - - public RelationDescription getRelationDescription(String entityName, String propertyName) { - EntityConfiguration entCfg = entitiesConfigurations.get(entityName); - RelationDescription relDesc = entCfg.getRelationDescription(propertyName); - if (relDesc != null) { - return relDesc; - } else if (entCfg.getParentEntityName() != null) { - // The field may be declared in a superclass ... - return getRelationDescription(entCfg.getParentEntityName(), propertyName); - } else { - return null; - } - } -} Deleted: trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) +++ trunk/src/main/org/jboss/envers/configuration/EntityConfiguration.java 2008-08-15 13:27:21 UTC (rev 105) @@ -1,103 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration; - -import org.jboss.envers.configuration.metadata.data.IdMappingData; -import org.jboss.envers.mapper.ExtendedPropertyMapper; -import org.jboss.envers.mapper.id.IdMapper; - -import java.util.Map; -import java.util.HashMap; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class EntityConfiguration { - private String entityName; - private String versionsEntityName; - private IdMappingData idMappingData; - private ExtendedPropertyMapper propertyMapper; - // Maps from property name - private Map relations; - private String parentEntityName; - - public EntityConfiguration(String entityName, String versionsEntityName, IdMappingData idMappingData, - ExtendedPropertyMapper propertyMapper, - String parentEntityName) { - this.entityName = entityName; - this.versionsEntityName = versionsEntityName; - this.idMappingData = idMappingData; - this.propertyMapper = propertyMapper; - this.parentEntityName = parentEntityName; - - this.relations = new HashMap(); - } - - public void addToOneRelation(String fromPropertyName, String toEntityName, IdMapper idMapper) { - relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.TO_ONE, - toEntityName, null, idMapper)); - } - - public void addOneToOneRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, - IdMapper idMapper) { - relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.ONE_TO_ONE, - toEntityName, mappedByPropertyName, idMapper)); - } - - public void addOneToManyRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, - IdMapper idMapper) { - relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.ONE_TO_MANY, - toEntityName, mappedByPropertyName, idMapper)); - } - - public boolean isRelation(String propertyName) { - return relations.get(propertyName) != null; - } - - public Iterable getRelationsIterator() { - return relations.values(); - } - - public RelationDescription getRelationDescription(String propertyName) { - return relations.get(propertyName); - } - - public IdMappingData getIdMappingData() { - return idMappingData; - } - - public ExtendedPropertyMapper getPropertyMapper() { - return propertyMapper; - } - - public String getParentEntityName() { - return parentEntityName; - } - - public String getEntityName() { - return entityName; - } - - public String getVersionsEntityName() { - return versionsEntityName; - } -} Modified: trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) +++ trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-15 13:27:21 UTC (rev 105) @@ -9,10 +9,7 @@ import org.jboss.envers.RevisionEntity; import org.jboss.envers.Versioned; import org.jboss.envers.configuration.metadata.MetadataTools; -import org.jboss.envers.revisioninfo.CustomRevisionInfoGenerator; -import org.jboss.envers.revisioninfo.DefaultRevisionInfoGenerator; -import org.jboss.envers.revisioninfo.RevisionNumberGenerator; -import org.jboss.envers.revisioninfo.RevisionInfoGenerator; +import org.jboss.envers.revisioninfo.*; import org.hibernate.MappingException; import org.hibernate.mapping.PersistentClass; import org.hibernate.cfg.Configuration; @@ -170,35 +167,27 @@ return new RevisionInfoConfigurationResult( new RevisionNumberGenerator(revisionInfoEntityName, revisionInfoGenerator), revisionPropType, - revisionInfoXmlMapping); + revisionInfoXmlMapping, + new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdName, revisionInfoTimestampName)); } public boolean isRevisionInfoEntityName(String entityName) { return revisionInfoEntityName.equals(entityName); } - - public String getRevisionInfoEntityName() { - return revisionInfoEntityName; - } - - public String getRevisionInfoIdName() { - return revisionInfoIdName; - } - - public String getRevisionInfoTimestampName() { - return revisionInfoTimestampName; - } } class RevisionInfoConfigurationResult { private final RevisionNumberGenerator revisionNumberGenerator; private final String revisionPropType; private final Document revisionInfoXmlMapping; + private final RevisionInfoQueryCreator revisionInfoQueryCreator; - RevisionInfoConfigurationResult(RevisionNumberGenerator revisionNumberGenerator, String revisionPropType, Document revisionInfoXmlMapping) { + RevisionInfoConfigurationResult(RevisionNumberGenerator revisionNumberGenerator, String revisionPropType, + Document revisionInfoXmlMapping, RevisionInfoQueryCreator revisionInfoQueryCreator) { this.revisionNumberGenerator = revisionNumberGenerator; this.revisionPropType = revisionPropType; this.revisionInfoXmlMapping = revisionInfoXmlMapping; + this.revisionInfoQueryCreator = revisionInfoQueryCreator; } public RevisionNumberGenerator getRevisionNumberGenerator() { @@ -212,4 +201,8 @@ public Document getRevisionInfoXmlMapping() { return revisionInfoXmlMapping; } + + public RevisionInfoQueryCreator getRevisionInfoQueryCreator() { + return revisionInfoQueryCreator; + } } \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-14 15:39:48 UTC (rev 104) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-15 13:27:21 UTC (rev 105) @@ -31,6 +31,7 @@ import org.jboss.envers.synchronization.VersionsSyncManager; import org.jboss.envers.tools.graph.GraphTopologicalSort; import org.jboss.envers.tools.reflection.YReflectionManager; +import org.jboss.envers.revisioninfo.RevisionInfoQueryCreator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.XMLWriter; @@ -52,6 +53,7 @@ private final VersionsSyncManager versionsSyncManager; private final EntitiesConfigurations entCfg; private final RevisionInfoConfiguration revInfoCfg; + private final RevisionInfoQueryCreator revisionInfoQueryCreator; public VersionsEntitiesConfiguration getVerEntCfg() { return verEntCfg; @@ -73,6 +75,10 @@ return entCfg; } + public RevisionInfoQueryCreator getRevisionInfoQueryGenerator() { + return revisionInfoQueryCreator; + } + private YReflectionManager getReflectionManager(Configuration cfg) { try { return new YReflectionManager(cfg); @@ -91,6 +97,7 @@ verEntCfg = new VersionsEntitiesConfiguration(properties, revInfoCfgResult.getRevisionPropType()); globalCfg = new GlobalConfiguration(properties); versionsSyncManager = new VersionsSyncManager(revInfoCfgResult.getRevisionNumberGenerator()); + revisionInfoQueryCreator = revInfoCfgResult.getRevisionInfoQueryCreator(); VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(this); DOMWriter writer = new DOMWriter(); Deleted: trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java 2008-08-14 15:39:48 UTC (rev 104) +++ trunk/src/main/org/jboss/envers/configuration/metadata/data/IdMappingData.java 2008-08-15 13:27:21 UTC (rev 105) @@ -1,54 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration.metadata.data; - -import org.jboss.envers.mapper.id.IdMapper; -import org.dom4j.Element; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class IdMappingData { - private IdMapper idMapper; - // Mapping which will be used to generate the entity - private Element xmlMapping; - // Mapping which will be used to generate references to the entity in related entities - private Element xmlRelationMapping; - - public IdMappingData(IdMapper idMapper, Element xmlMapping, Element xmlRelationMapping) { - this.idMapper = idMapper; - this.xmlMapping = xmlMapping; - this.xmlRelationMapping = xmlRelationMapping; - } - - public IdMapper getIdMapper() { - return idMapper; - } - - public Element getXmlMapping() { - return xmlMapping; - } - - public Element getXmlRelationMapping() { - return xmlRelationMapping; - } -} Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-14 15:39:48 UTC (rev 104) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-15 13:27:21 UTC (rev 105) @@ -26,8 +26,6 @@ import org.hibernate.Query; import org.hibernate.engine.SessionImplementor; import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; -import org.jboss.envers.configuration.RevisionInfoConfiguration; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.exception.NotVersionedException; import org.jboss.envers.exception.RevisionDoesNotExistException; @@ -49,15 +47,11 @@ private SessionImplementor sessionImplementor; private Session session; - private final RevisionInfoConfiguration revInfoCfg; - public VersionsReaderImpl(VersionsConfiguration verCfg, Session session, SessionImplementor sessionImplementor) { this.verCfg = verCfg; this.sessionImplementor = sessionImplementor; this.session = session; - - revInfoCfg = verCfg.getRevInfoCfg(); } private void checkSession() { @@ -164,13 +158,8 @@ checkPositive(revision, "Entity revision"); checkSession(); - StringBuilder queryStr = new StringBuilder(); - queryStr.append("select rev.").append(revInfoCfg.getRevisionInfoTimestampName()) - .append(" from ").append(revInfoCfg.getRevisionInfoEntityName()) - .append(" rev where ").append(revInfoCfg.getRevisionInfoIdName()).append(" = :_revision_number"); + Query query = verCfg.getRevisionInfoQueryGenerator().getRevisionDateQuery(session, revision); - Query query = session.createQuery(queryStr.toString()).setParameter("_revision_number", revision); - try { Long timestamp = (Long) query.uniqueResult(); if (timestamp == null) { @@ -187,13 +176,8 @@ checkNotNull(date, "Date of revision"); checkSession(); - StringBuilder queryStr = new StringBuilder(); - queryStr.append("select max(rev.").append(revInfoCfg.getRevisionInfoIdName()) - .append(") from ").append(revInfoCfg.getRevisionInfoEntityName()) - .append(" rev where ").append(revInfoCfg.getRevisionInfoTimestampName()).append(" <= :_revision_date"); + Query query = verCfg.getRevisionInfoQueryGenerator().getRevisionNumberForDateQuery(session, date); - Query query = session.createQuery(queryStr.toString()).setParameter("_revision_date", date.getTime()); - try { Number res = (Number) query.uniqueResult(); if (res == null) { @@ -213,15 +197,8 @@ checkPositive(revision, "Entity revision"); checkSession(); - StringBuilder queryStr = new StringBuilder(); - queryStr.append("select rev from ") - .append(revInfoCfg.getRevisionInfoEntityName()) - .append(" rev where ") - .append(revInfoCfg.getRevisionInfoIdName()) - .append(" = :_revision_number"); + Query query = verCfg.getRevisionInfoQueryGenerator().getRevisionQuery(session, revision); - Query query = session.createQuery(queryStr.toString()).setParameter("_revision_number", revision); - try { T revisionData = (T) query.uniqueResult(); Added: trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java 2008-08-15 13:27:21 UTC (rev 105) @@ -0,0 +1,48 @@ +package org.jboss.envers.revisioninfo; + +import org.hibernate.Session; +import org.hibernate.Query; + +import java.util.Date; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionInfoQueryCreator { + private final String revisionDateQuery; + private final String revisionNumberForDateQuery; + private final String revisionQuery; + + public RevisionInfoQueryCreator(String revisionInfoEntityName, String revisionInfoIdName, + String revisionInfoTimestampName) { + revisionDateQuery = new StringBuilder() + .append("select rev.").append(revisionInfoTimestampName) + .append(" from ").append(revisionInfoEntityName) + .append(" rev where ").append(revisionInfoIdName).append(" = :_revision_number") + .toString(); + + revisionNumberForDateQuery = new StringBuilder() + .append("select max(rev.").append(revisionInfoIdName) + .append(") from ").append(revisionInfoEntityName) + .append(" rev where ").append(revisionInfoTimestampName).append(" <= :_revision_date") + .toString(); + + revisionQuery = new StringBuilder() + .append("select rev from ").append(revisionInfoEntityName) + .append(" rev where ").append(revisionInfoIdName) + .append(" = :_revision_number") + .toString(); + } + + public Query getRevisionDateQuery(Session session, Number revision) { + return session.createQuery(revisionDateQuery).setParameter("_revision_number", revision); + } + + public Query getRevisionNumberForDateQuery(Session session, Date date) { + return session.createQuery(revisionNumberForDateQuery).setParameter("_revision_date", date.getTime()); + } + + public Query getRevisionQuery(Session session, Number revision) { + return session.createQuery(revisionQuery).setParameter("_revision_number", revision); + } +} From jboss-envers-commits at lists.jboss.org Fri Aug 15 10:00:44 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Fri, 15 Aug 2008 10:00:44 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r106 - in trunk/src/main/org/jboss/envers: reader and 1 other directories. Message-ID: Author: adamw Date: 2008-08-15 10:00:41 -0400 (Fri, 15 Aug 2008) New Revision: 106 Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java trunk/src/main/org/jboss/envers/reader/lazy/OneToManyInitializor.java Log: ENVERS-37: componentizing configuration - moving some methods out of versions reader Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java 2008-08-15 13:27:21 UTC (rev 105) +++ trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java 2008-08-15 14:00:41 UTC (rev 106) @@ -51,12 +51,8 @@ return false; } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { - doMap(obj, primaryKey, versionsReader, revision); - } - @SuppressWarnings({"unchecked"}) - private void doMap(Object obj, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { if (obj == null) { return; } Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java 2008-08-15 13:27:21 UTC (rev 105) +++ trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java 2008-08-15 14:00:41 UTC (rev 106) @@ -24,8 +24,12 @@ import org.jboss.envers.mapper.PropertyMapper; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.tools.reflection.ReflectionTools; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.exception.VersionsException; import org.hibernate.property.Setter; +import org.hibernate.NonUniqueResultException; +import javax.persistence.NoResultException; import java.util.Map; /** @@ -47,19 +51,24 @@ } public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { - doMap(obj, primaryKey, versionsReader, revision); - } - - private void doMap(Object obj, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { if (obj == null) { return; } Class entityClass = ReflectionTools.loadClass(owningEntityName); - Object value = versionsReader.findOneReferencing(entityClass, owningEntityName, owningReferencePropertyName, - primaryKey, revision); + Object value; + try { + value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) + .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getSingleResult(); + } catch (NoResultException e) { + value = null; + } catch (NonUniqueResultException e) { + throw new VersionsException("Many versions results for one-to-one relationship: (" + owningEntityName + + ", " + owningReferencePropertyName + ")"); + } + Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); setter.set(obj, value, null); } Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-15 13:27:21 UTC (rev 105) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-15 14:00:41 UTC (rev 106) @@ -97,42 +97,7 @@ } } - public Object findOneReferencing(Class cls, String owningEntityName, String owningReferencePropertyName, - Object ownedEntityId, Number revision) { - try { - return createQuery().forEntitiesAtRevision(cls, revision) - .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, ownedEntityId)).getSingleResult(); - } catch (NoResultException e) { - return null; - } catch (NonUniqueResultException e) { - throw new VersionsException("Many versions results for one-to-one relationship: (" + owningEntityName + - ", " + owningReferencePropertyName + ")"); - } - } - @SuppressWarnings({"unchecked"}) - public Object findManyReferencing(Class cls, String owningReferencePropertyName, Object ownedEntityId, - Number revision, Class collectionClass) { - List queryResult = createQuery().forEntitiesAtRevision(cls, revision) - .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, ownedEntityId)).getResultList(); - - if (collectionClass.isAssignableFrom(queryResult.getClass())) { - return queryResult; - } else { - Collection result; - try { - result = collectionClass.newInstance(); - } catch (Exception e) { - throw new VersionsException(e); - } - - result.addAll(queryResult); - - return result; - } - } - - @SuppressWarnings({"unchecked"}) public List getRevisions(Class cls, Object primaryKey) throws IllegalArgumentException, NotVersionedException, IllegalStateException { // todo: if a class is not versioned from the beginning, there's a missing ADD rev - what then? Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-15 13:27:21 UTC (rev 105) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-15 14:00:41 UTC (rev 106) @@ -26,8 +26,6 @@ import org.jboss.envers.VersionsReader; import org.jboss.envers.configuration.VersionsConfiguration; -import java.util.Collection; - /** * An interface exposed by a VersionsReader to library-facing classes. * @author Adam Warski (adam at warski dot org) @@ -37,11 +35,5 @@ Session getSession(); - Object findOneReferencing(Class cls, String owningEntityName, String owningReferencePropertyName, - Object ownedEntityId, Number revision); - - Object findManyReferencing(Class cls, String owningReferencePropertyName, Object ownedEntityId, Number revision, - Class collectionClass); - VersionsConfiguration getVerCfg(); } Modified: trunk/src/main/org/jboss/envers/reader/lazy/OneToManyInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/OneToManyInitializor.java 2008-08-15 13:27:21 UTC (rev 105) +++ trunk/src/main/org/jboss/envers/reader/lazy/OneToManyInitializor.java 2008-08-15 14:00:41 UTC (rev 106) @@ -23,8 +23,11 @@ import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.reader.lazy.proxy.Initializor; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.exception.VersionsException; import java.util.Collection; +import java.util.List; /** * @author Adam Warski (adam at warski dot org) @@ -50,7 +53,22 @@ @SuppressWarnings({"unchecked"}) public T initialize() { - return (T) versionsReader.findManyReferencing(entityClass, owningReferencePropertyName, - primaryKey, revision, collectionClass); + List queryResult = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) + .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getResultList(); + + if (collectionClass.isAssignableFrom(queryResult.getClass())) { + return (T) queryResult; + } else { + Collection result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + result.addAll(queryResult); + + return (T) result; + } } } From jboss-envers-commits at lists.jboss.org Sat Aug 16 08:03:50 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 16 Aug 2008 08:03:50 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r107 - in trunk/src/main/org/jboss/envers/query: impl and 1 other directory. Message-ID: Author: adamw Date: 2008-08-16 08:03:50 -0400 (Sat, 16 Aug 2008) New Revision: 107 Modified: trunk/src/main/org/jboss/envers/query/criteria/AggregatedFieldVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/BetweenVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java trunk/src/main/org/jboss/envers/query/criteria/IdentifierEqVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/IlikeVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/InVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/LogicalVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/NotVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/PropertyVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/RevisionVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/VersionsConjunction.java trunk/src/main/org/jboss/envers/query/criteria/VersionsCriterion.java trunk/src/main/org/jboss/envers/query/criteria/VersionsDisjunction.java trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java Log: ENVERS-37: componentizing configuration - criterions do not depend on VersionsReader Modified: trunk/src/main/org/jboss/envers/query/criteria/AggregatedFieldVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/AggregatedFieldVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/AggregatedFieldVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -22,8 +22,8 @@ package org.jboss.envers.query.criteria; import org.hibernate.criterion.*; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; import java.util.List; import java.util.ArrayList; @@ -52,11 +52,11 @@ return this; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - CriteriaTools.checkPropertyNotARelation(versionsReader, entityName, propertyName); + CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); - String versionsEntityName = versionsReader.getVerCfg().getVerEntCfg().getVersionsEntityName(entityName); + String versionsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(entityName); // This will be the aggregated criteria, containing all the specified conditions DetachedCriteria aggregatedCriteria = DetachedCriteria.forEntityName(versionsEntityName); @@ -68,7 +68,7 @@ // First adding all specified conditions both to the main criteria, as well as to the // aggregated one. for (VersionsCriterion versionsCriteria : criterions) { - Criterion transformedCriterion = versionsCriteria.toVersionsCriterion(entityName, versionsReader); + Criterion transformedCriterion = versionsCriteria.toVersionsCriterion(verCfg, entityName); conjunction.add(transformedCriterion); aggregatedCriteria.add(transformedCriterion); Modified: trunk/src/main/org/jboss/envers/query/criteria/BetweenVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/BetweenVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/BetweenVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -23,8 +23,8 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -40,9 +40,9 @@ this.hi = hi; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - CriteriaTools.checkPropertyNotARelation(versionsReader, entityName, propertyName); + CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); return Restrictions.between(propertyName, lo, hi); } } Modified: trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java 2008-08-16 12:03:50 UTC (rev 107) @@ -21,9 +21,9 @@ */ package org.jboss.envers.query.criteria; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -31,18 +31,17 @@ public class CriteriaTools { private CriteriaTools() { } - public static void checkPropertyNotARelation(VersionsReaderImplementor versionsReader, String entityName, + public static void checkPropertyNotARelation(VersionsConfiguration verCfg, String entityName, String propertyName) throws VersionsException { - if (versionsReader.getVerCfg().getEntCfg().get(entityName).isRelation(propertyName)) { + if (verCfg.getEntCfg().get(entityName).isRelation(propertyName)) { throw new VersionsException("This criterion cannot be used on a property that is " + "a relation to another property."); } } - public static RelationDescription getRelatedEntity(VersionsReaderImplementor versionsReader, String entityName, + public static RelationDescription getRelatedEntity(VersionsConfiguration verCfg, String entityName, String propertyName) throws VersionsException { - RelationDescription relationDesc = versionsReader.getVerCfg() - .getEntCfg().get(entityName).getRelationDescription(propertyName); + RelationDescription relationDesc = verCfg.getEntCfg().get(entityName).getRelationDescription(propertyName); if (relationDesc == null) { return null; Modified: trunk/src/main/org/jboss/envers/query/criteria/IdentifierEqVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/IdentifierEqVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/IdentifierEqVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -22,8 +22,8 @@ package org.jboss.envers.query.criteria; import org.hibernate.criterion.Criterion; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -35,9 +35,9 @@ this.id = id; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - return versionsReader.getVerCfg().getEntCfg().getIdMapper(entityName) - .getIdEqualsCriterion(id, versionsReader.getVerCfg().getVerEntCfg().getOriginalIdPropName(), true); + return verCfg.getEntCfg().getIdMapper(entityName) + .getIdEqualsCriterion(id, verCfg.getVerEntCfg().getOriginalIdPropName(), true); } } Modified: trunk/src/main/org/jboss/envers/query/criteria/IlikeVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/IlikeVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/IlikeVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -24,8 +24,8 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -43,9 +43,9 @@ this(propertyName, matchMode.toMatchString(value)); } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - CriteriaTools.checkPropertyNotARelation(versionsReader, entityName, propertyName); + CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); return Restrictions.ilike(propertyName, value); } } Modified: trunk/src/main/org/jboss/envers/query/criteria/InVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/InVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/InVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -23,8 +23,8 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -38,9 +38,9 @@ this.values = values; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - CriteriaTools.checkPropertyNotARelation(versionsReader, entityName, propertyName); + CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); return Restrictions.in(propertyName, values); } } Modified: trunk/src/main/org/jboss/envers/query/criteria/LogicalVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/LogicalVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/LogicalVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -22,8 +22,8 @@ package org.jboss.envers.query.criteria; import org.hibernate.criterion.Criterion; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -39,9 +39,9 @@ this.op = op; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - return new PublicLogicalExpression(lhs.toVersionsCriterion(null, versionsReader), - rhs.toVersionsCriterion(null, versionsReader), op); + return new PublicLogicalExpression(lhs.toVersionsCriterion(verCfg, null), + rhs.toVersionsCriterion(verCfg, null), op); } } Modified: trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -23,9 +23,9 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -37,9 +37,9 @@ this.propertyName = propertyName; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(versionsReader, entityName, propertyName); + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); if (relatedEntity == null) { return Restrictions.isNotNull(propertyName); Modified: trunk/src/main/org/jboss/envers/query/criteria/NotVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/NotVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/NotVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -23,8 +23,8 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -36,8 +36,8 @@ this.criterion = criterion; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - return Restrictions.not(criterion.toVersionsCriterion(null, versionsReader)); + return Restrictions.not(criterion.toVersionsCriterion(verCfg, null)); } } Modified: trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -23,9 +23,9 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -37,9 +37,9 @@ this.propertyName = propertyName; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(versionsReader, entityName, propertyName); + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); if (relatedEntity == null) { return Restrictions.isNull(propertyName); Modified: trunk/src/main/org/jboss/envers/query/criteria/PropertyVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/PropertyVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/PropertyVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -22,8 +22,8 @@ package org.jboss.envers.query.criteria; import org.hibernate.criterion.Criterion; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -39,10 +39,10 @@ this.op = op; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - CriteriaTools.checkPropertyNotARelation(versionsReader, entityName, propertyName); - CriteriaTools.checkPropertyNotARelation(versionsReader, entityName, otherPropertyName); + CriteriaTools.checkPropertyNotARelation(verCfg, entityName, propertyName); + CriteriaTools.checkPropertyNotARelation(verCfg, entityName, otherPropertyName); return new PublicPropertyExpression(propertyName, otherPropertyName, op); } } Modified: trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -22,9 +22,9 @@ package org.jboss.envers.query.criteria; import org.hibernate.criterion.Criterion; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -40,9 +40,9 @@ this.equals = equals; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(versionsReader, entityName, propertyName); + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); if (relatedEntity == null) { throw new VersionsException("This criterion can only be used on a property that is " + Modified: trunk/src/main/org/jboss/envers/query/criteria/RevisionVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/RevisionVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/RevisionVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -22,8 +22,8 @@ package org.jboss.envers.query.criteria; import org.hibernate.criterion.Criterion; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -37,9 +37,9 @@ this.op = op; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - return new PublicSimpleExpression(versionsReader.getVerCfg().getVerEntCfg().getRevisionPropPath(), + return new PublicSimpleExpression(verCfg.getVerEntCfg().getRevisionPropPath(), value, op, false); } } \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java 2008-08-16 12:03:50 UTC (rev 107) @@ -22,9 +22,9 @@ package org.jboss.envers.query.criteria; import org.hibernate.criterion.Criterion; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -48,9 +48,9 @@ this.ignoreCase = ignoreCase; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { - RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(versionsReader, entityName, propertyName); + RelationDescription relatedEntity = CriteriaTools.getRelatedEntity(verCfg, entityName, propertyName); if (relatedEntity == null) { return new PublicSimpleExpression(propertyName, value, op, ignoreCase); Modified: trunk/src/main/org/jboss/envers/query/criteria/VersionsConjunction.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/VersionsConjunction.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/VersionsConjunction.java 2008-08-16 12:03:50 UTC (rev 107) @@ -24,8 +24,8 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Conjunction; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; import java.util.ArrayList; import java.util.List; @@ -45,12 +45,12 @@ return this; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { Conjunction conjunction = Restrictions.conjunction(); for (VersionsCriterion criterion : criterions) { - conjunction.add(criterion.toVersionsCriterion(null, versionsReader)); + conjunction.add(criterion.toVersionsCriterion(verCfg, null)); } return conjunction; Modified: trunk/src/main/org/jboss/envers/query/criteria/VersionsCriterion.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/VersionsCriterion.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/VersionsCriterion.java 2008-08-16 12:03:50 UTC (rev 107) @@ -23,11 +23,11 @@ import org.hibernate.criterion.Criterion; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) */ public interface VersionsCriterion { - Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) throws VersionsException; + Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException; } Modified: trunk/src/main/org/jboss/envers/query/criteria/VersionsDisjunction.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/VersionsDisjunction.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/criteria/VersionsDisjunction.java 2008-08-16 12:03:50 UTC (rev 107) @@ -24,8 +24,8 @@ import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; -import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; import java.util.List; import java.util.ArrayList; @@ -45,12 +45,12 @@ return this; } - public Criterion toVersionsCriterion(String entityName, VersionsReaderImplementor versionsReader) + public Criterion toVersionsCriterion(VersionsConfiguration verCfg, String entityName) throws VersionsException { Disjunction conjunction = Restrictions.disjunction(); for (VersionsCriterion criterion : criterions) { - conjunction.add(criterion.toVersionsCriterion(null, versionsReader)); + conjunction.add(criterion.toVersionsCriterion(verCfg, null)); } return conjunction; Modified: trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-16 12:03:50 UTC (rev 107) @@ -73,7 +73,7 @@ versionsCriteria.add(Property.forName(revisionPropertyPath).eq(maxRevCriteria)); // all specified conditions, transformed for (VersionsCriterion criterion : criterions) { - versionsCriteria.add(criterion.toVersionsCriterion(entityName, versionsReader)); + versionsCriteria.add(criterion.toVersionsCriterion(versionsReader.getVerCfg(), entityName)); } List queryResult = versionsCriteria.list(); Modified: trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-15 14:00:41 UTC (rev 106) +++ trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-16 12:03:50 UTC (rev 107) @@ -68,7 +68,7 @@ // all specified conditions, transformed for (VersionsCriterion criterion : criterions) { - versionsCriteria.add(criterion.toVersionsCriterion(entityName, versionsReader)); + versionsCriteria.add(criterion.toVersionsCriterion(versionsReader.getVerCfg(), entityName)); } if (!hasProjection && !hasOrder) { From jboss-envers-commits at lists.jboss.org Sat Aug 16 08:12:37 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 16 Aug 2008 08:12:37 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r108 - in trunk/src/main/org/jboss/envers: query and 4 other directories. Message-ID: Author: adamw Date: 2008-08-16 08:12:37 -0400 (Sat, 16 Aug 2008) New Revision: 108 Modified: trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java trunk/src/main/org/jboss/envers/query/RevisionProperty.java trunk/src/main/org/jboss/envers/query/RevisionTypeProperty.java trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java trunk/src/main/org/jboss/envers/query/order/VersionsOrder.java trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java trunk/src/main/org/jboss/envers/query/projection/VersionsProjection.java trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java Log: ENVERS-37: versions configuration explicitly passed as an argument, not taken from versions reader Modified: trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java =================================================================== --- trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-16 12:12:37 UTC (rev 108) @@ -34,13 +34,12 @@ * @author Adam Warski (adam at warski dot org) */ public class EntityInstantiator { - private VersionsReaderImplementor versionsReader; - private VersionsConfiguration verCfg; + private final VersionsConfiguration verCfg; + private final VersionsReaderImplementor versionsReader; - public EntityInstantiator(VersionsReaderImplementor versionsReader) { + public EntityInstantiator(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader) { + this.verCfg = verCfg; this.versionsReader = versionsReader; - - verCfg = versionsReader.getVerCfg(); } /** Modified: trunk/src/main/org/jboss/envers/query/RevisionProperty.java =================================================================== --- trunk/src/main/org/jboss/envers/query/RevisionProperty.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/RevisionProperty.java 2008-08-16 12:12:37 UTC (rev 108) @@ -27,7 +27,7 @@ import org.jboss.envers.query.order.RevisionVersionsOrder; import org.jboss.envers.query.projection.VersionsProjection; import org.jboss.envers.query.projection.RevisionVersionsProjection; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; @@ -115,7 +115,7 @@ return new RevisionProperty(); } - public Projection getProjection(String entityName, VersionsReaderImplementor versionsReader) { - return Projections.property(versionsReader.getVerCfg().getVerEntCfg().getRevisionPropPath()); + public Projection getProjection(VersionsConfiguration verCfg, String entityName) { + return Projections.property(verCfg.getVerEntCfg().getRevisionPropPath()); } } Modified: trunk/src/main/org/jboss/envers/query/RevisionTypeProperty.java =================================================================== --- trunk/src/main/org/jboss/envers/query/RevisionTypeProperty.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/RevisionTypeProperty.java 2008-08-16 12:12:37 UTC (rev 108) @@ -22,7 +22,7 @@ package org.jboss.envers.query; import org.jboss.envers.query.projection.VersionsProjection; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; @@ -40,7 +40,7 @@ return new RevisionTypeProperty(); } - public Projection getProjection(String entityName, VersionsReaderImplementor versionsReader) { - return Projections.property(versionsReader.getVerCfg().getVerEntCfg().getRevisionTypePropName()); + public Projection getProjection(VersionsConfiguration verCfg, String entityName) { + return Projections.property(verCfg.getVerEntCfg().getRevisionTypePropName()); } } \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java =================================================================== --- trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-16 12:12:37 UTC (rev 108) @@ -25,14 +25,17 @@ import org.jboss.envers.query.impl.EntitiesAtRevisionQuery; import org.jboss.envers.query.impl.RevisionsOfEntityQuery; import static org.jboss.envers.tools.ArgumentsTools.*; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) */ public class VersionsQueryCreator { - private VersionsReaderImplementor versionsReaderImplementor; + private final VersionsConfiguration verCfg; + private final VersionsReaderImplementor versionsReaderImplementor; - public VersionsQueryCreator(VersionsReaderImplementor versionsReaderImplementor) { + public VersionsQueryCreator(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReaderImplementor) { + this.verCfg = verCfg; this.versionsReaderImplementor = versionsReaderImplementor; } @@ -48,7 +51,7 @@ public VersionsQuery forEntitiesAtRevision(Class c, Number revision) { checkNotNull(revision, "Entity revision"); checkPositive(revision, "Entity revision"); - return new EntitiesAtRevisionQuery(versionsReaderImplementor, c, revision); + return new EntitiesAtRevisionQuery(verCfg, versionsReaderImplementor, c, revision); } /** @@ -67,6 +70,6 @@ * unless an order or projection is added. */ public VersionsQuery forRevisionsOfEntity(Class c, boolean selectEntitiesOnly, boolean selectDeletedEntities) { - return new RevisionsOfEntityQuery(versionsReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities); + return new RevisionsOfEntityQuery(verCfg, versionsReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities); } } Modified: trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-16 12:12:37 UTC (rev 108) @@ -28,6 +28,7 @@ import org.jboss.envers.query.projection.VersionsProjection; import org.jboss.envers.query.order.VersionsOrder; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Order; import org.hibernate.Criteria; @@ -44,7 +45,7 @@ * @author Adam Warski (adam at warski dot org) */ public abstract class AbstractVersionsQuery implements VersionsQuery { - protected VersionsReaderImplementor versionsReader; + //protected VersionsReaderImplementor versionsReader; protected EntityInstantiator entityInstantiator; protected List criterions; @@ -55,14 +56,16 @@ protected boolean hasProjection; protected boolean hasOrder; - protected AbstractVersionsQuery(VersionsReaderImplementor versionsReader, Class cls) { - this.versionsReader = versionsReader; + protected final VersionsConfiguration verCfg; + protected AbstractVersionsQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, Class cls) { + this.verCfg = verCfg; + criterions = new ArrayList(); - entityInstantiator = new EntityInstantiator(versionsReader); + entityInstantiator = new EntityInstantiator(verCfg, versionsReader); entityName = cls.getName(); - versionsEntityName = versionsReader.getVerCfg().getVerEntCfg().getVersionsEntityName(entityName); + versionsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(entityName); versionsCriteria = versionsReader.getSession().createCriteria(versionsEntityName, "e"); } @@ -101,7 +104,7 @@ public VersionsQuery setProjection(VersionsProjection projection) { hasProjection = true; - versionsCriteria.setProjection(projection.getProjection(entityName, versionsReader)); + versionsCriteria.setProjection(projection.getProjection(verCfg, entityName)); return this; } @@ -113,7 +116,7 @@ public VersionsQuery addOrder(VersionsOrder order) { hasOrder = true; - versionsCriteria.addOrder(order.getOrder(entityName, versionsReader)); + versionsCriteria.addOrder(order.getOrder(verCfg, entityName)); return this; } Modified: trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-16 12:12:37 UTC (rev 108) @@ -25,6 +25,7 @@ import org.jboss.envers.query.criteria.VersionsCriterion; import org.jboss.envers.RevisionType; import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.*; import java.util.List; @@ -36,8 +37,9 @@ public class EntitiesAtRevisionQuery extends AbstractVersionsQuery { private Number revision; - public EntitiesAtRevisionQuery(VersionsReaderImplementor versionsReader, Class cls, Number revision) { - super(versionsReader, cls); + public EntitiesAtRevisionQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, Class cls, + Number revision) { + super(verCfg, versionsReader, cls); this.revision = revision; } @@ -54,7 +56,7 @@ DetachedCriteria maxRevCriteria = DetachedCriteria.forEntityName(versionsEntityName, "e2"); - VersionsEntitiesConfiguration verEntCfg = versionsReader.getVerCfg().getVerEntCfg(); + VersionsEntitiesConfiguration verEntCfg = verCfg.getVerEntCfg(); String revisionPropertyPath = verEntCfg.getRevisionPropPath(); String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); @@ -64,7 +66,7 @@ // e2.revision <= :revision maxRevCriteria.add(Restrictions.le(revisionPropertyPath, revision)); // e2.id = e.id - maxRevCriteria.add(versionsReader.getVerCfg().getEntCfg().getIdMapper(entityName).getIdsEqualCriterion( + maxRevCriteria.add(verCfg.getEntCfg().getIdMapper(entityName).getIdsEqualCriterion( "e." + originalIdPropertyName, "e2." + originalIdPropertyName)); // e.revision_type != DEL AND @@ -73,7 +75,7 @@ versionsCriteria.add(Property.forName(revisionPropertyPath).eq(maxRevCriteria)); // all specified conditions, transformed for (VersionsCriterion criterion : criterions) { - versionsCriteria.add(criterion.toVersionsCriterion(versionsReader.getVerCfg(), entityName)); + versionsCriteria.add(criterion.toVersionsCriterion(verCfg, entityName)); } List queryResult = versionsCriteria.list(); Modified: trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-16 12:12:37 UTC (rev 108) @@ -26,6 +26,7 @@ import org.jboss.envers.query.criteria.VersionsCriterion; import org.jboss.envers.RevisionType; import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Order; import org.hibernate.criterion.Property; @@ -40,9 +41,9 @@ private final boolean selectEntitiesOnly; private final boolean selectDeletedEntities; - public RevisionsOfEntityQuery(VersionsReaderImplementor versionsReader, Class cls, boolean selectEntitiesOnly, - boolean selectDeletedEntities) { - super(versionsReader, cls); + public RevisionsOfEntityQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, + Class cls, boolean selectEntitiesOnly, boolean selectDeletedEntities) { + super(verCfg, versionsReader, cls); this.selectEntitiesOnly = selectEntitiesOnly; this.selectDeletedEntities = selectDeletedEntities; @@ -50,7 +51,7 @@ @SuppressWarnings({"unchecked"}) public List list() throws VersionsException { - VersionsEntitiesConfiguration verEntCfg = versionsReader.getVerCfg().getVerEntCfg(); + VersionsEntitiesConfiguration verEntCfg = verCfg.getVerEntCfg(); /* The query that should be executed in the versions table: @@ -68,7 +69,7 @@ // all specified conditions, transformed for (VersionsCriterion criterion : criterions) { - versionsCriteria.add(criterion.toVersionsCriterion(versionsReader.getVerCfg(), entityName)); + versionsCriteria.add(criterion.toVersionsCriterion(verCfg, entityName)); } if (!hasProjection && !hasOrder) { Modified: trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java =================================================================== --- trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java 2008-08-16 12:12:37 UTC (rev 108) @@ -22,7 +22,7 @@ package org.jboss.envers.query.order; import org.hibernate.criterion.Order; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -34,8 +34,8 @@ this.asc = asc; } - public Order getOrder(String entityName, VersionsReaderImplementor versionsReader) { - String revisionPropPath = versionsReader.getVerCfg().getVerEntCfg().getRevisionPropPath(); + public Order getOrder(VersionsConfiguration verCfg, String entityName) { + String revisionPropPath = verCfg.getVerEntCfg().getRevisionPropPath(); if (asc) { return Order.asc(revisionPropPath); Modified: trunk/src/main/org/jboss/envers/query/order/VersionsOrder.java =================================================================== --- trunk/src/main/org/jboss/envers/query/order/VersionsOrder.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/order/VersionsOrder.java 2008-08-16 12:12:37 UTC (rev 108) @@ -23,10 +23,11 @@ import org.hibernate.criterion.Order; import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) */ public interface VersionsOrder { - public Order getOrder(String entityName, VersionsReaderImplementor versionsReader); + public Order getOrder(VersionsConfiguration verCfg, String entityName); } Modified: trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java 2008-08-16 12:12:37 UTC (rev 108) @@ -23,7 +23,7 @@ import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -35,7 +35,7 @@ this.projection = projection; } - public Projection getProjection(String entityName, VersionsReaderImplementor versionsReader) { - return Projections.distinct(projection.getProjection(entityName, versionsReader)); + public Projection getProjection(VersionsConfiguration verCfg, String entityName) { + return Projections.distinct(projection.getProjection(verCfg, entityName)); } } Modified: trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java 2008-08-16 12:12:37 UTC (rev 108) @@ -22,7 +22,7 @@ package org.jboss.envers.query.projection; import org.hibernate.criterion.Projection; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; /** * Wraps a hibernate projection so that it can be used as a versions projection. @@ -35,7 +35,7 @@ this.wrapped = wrapped; } - public Projection getProjection(String entityName, VersionsReaderImplementor versionsReader) { + public Projection getProjection(VersionsConfiguration verCfg, String entityName) { return wrapped; } } Modified: trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java 2008-08-16 12:12:37 UTC (rev 108) @@ -23,7 +23,7 @@ import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; /** * @author Adam Warski (adam at warski dot org) @@ -42,8 +42,8 @@ this.type = type; } - public Projection getProjection(String entityName, VersionsReaderImplementor versionsReader) { - String revisionPropPath = versionsReader.getVerCfg().getVerEntCfg().getRevisionPropPath(); + public Projection getProjection(VersionsConfiguration verCfg, String entityName) { + String revisionPropPath = verCfg.getVerEntCfg().getRevisionPropPath(); switch (type) { case MAX: return Projections.max(revisionPropPath); Modified: trunk/src/main/org/jboss/envers/query/projection/VersionsProjection.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/VersionsProjection.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/projection/VersionsProjection.java 2008-08-16 12:12:37 UTC (rev 108) @@ -21,12 +21,12 @@ */ package org.jboss.envers.query.projection; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Projection; /** * @author Adam Warski (adam at warski dot org) */ public interface VersionsProjection { - public Projection getProjection(String entityName, VersionsReaderImplementor versionsReader); + public Projection getProjection(VersionsConfiguration verCfg, String entityName); } Modified: trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java 2008-08-16 12:12:37 UTC (rev 108) @@ -24,7 +24,7 @@ import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; import org.hibernate.criterion.ProjectionList; -import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; import java.util.List; import java.util.ArrayList; @@ -49,11 +49,11 @@ return this; } - public Projection getProjection(String entityName, VersionsReaderImplementor versionsReader) { + public Projection getProjection(VersionsConfiguration verCfg, String entityName) { ProjectionList list = Projections.projectionList(); for (VersionsProjection projection : projections) { - list.add(projection.getProjection(entityName, versionsReader)); + list.add(projection.getProjection(verCfg, entityName)); } return list; Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-16 12:12:37 UTC (rev 108) @@ -43,9 +43,9 @@ * @author Adam Warski (adam at warski dot org) */ public class VersionsReaderImpl implements VersionsReaderImplementor { - private VersionsConfiguration verCfg; - private SessionImplementor sessionImplementor; - private Session session; + private final VersionsConfiguration verCfg; + private final SessionImplementor sessionImplementor; + private final Session session; public VersionsReaderImpl(VersionsConfiguration verCfg, Session session, SessionImplementor sessionImplementor) { @@ -68,10 +68,6 @@ return session; } - public VersionsConfiguration getVerCfg() { - return verCfg; - } - @SuppressWarnings({"unchecked"}) public T find(Class cls, Object primaryKey, Number revision) throws IllegalArgumentException, NotVersionedException, IllegalStateException { @@ -178,6 +174,6 @@ } public VersionsQueryCreator createQuery() { - return new VersionsQueryCreator(this); + return new VersionsQueryCreator(verCfg, this); } } Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-16 12:03:50 UTC (rev 107) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-16 12:12:37 UTC (rev 108) @@ -34,6 +34,4 @@ SessionImplementor getSessionImplementor(); Session getSession(); - - VersionsConfiguration getVerCfg(); } From jboss-envers-commits at lists.jboss.org Sat Aug 16 08:33:04 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 16 Aug 2008 08:33:04 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r109 - trunk/lib/hibernate-3.3.0. Message-ID: Author: adamw Date: 2008-08-16 08:33:03 -0400 (Sat, 16 Aug 2008) New Revision: 109 Modified: trunk/lib/hibernate-3.3.0/hibernate3.jar Log: ENVERS-38: upgrading to hibernate 3.3.0.GA Modified: trunk/lib/hibernate-3.3.0/hibernate3.jar =================================================================== (Binary files differ) From jboss-envers-commits at lists.jboss.org Sat Aug 16 08:44:50 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 16 Aug 2008 08:44:50 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r110 - in trunk/src/main/org/jboss/envers: configuration/metadata and 6 other directories. Message-ID: Author: adamw Date: 2008-08-16 08:44:50 -0400 (Sat, 16 Aug 2008) New Revision: 110 Added: trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java trunk/src/main/org/jboss/envers/configuration/metadata/PropertyStoreInfo.java Removed: trunk/src/main/org/jboss/envers/configuration/metadata/data/ Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java trunk/src/main/org/jboss/envers/reader/lazy/ToOneDelegateSessionImplementor.java trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java Log: ENVERS-37: versions reader no longer is a holder of Session Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-16 12:44:50 UTC (rev 110) @@ -26,7 +26,7 @@ import org.hibernate.MappingException; import org.jboss.envers.configuration.metadata.VersionsMetadataGenerator; import org.jboss.envers.configuration.metadata.AnnotationsMetadataReader; -import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; +import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; import org.jboss.envers.configuration.entities.EntitiesConfigurations; import org.jboss.envers.synchronization.VersionsSyncManager; import org.jboss.envers.tools.graph.GraphTopologicalSort; @@ -75,7 +75,7 @@ return entCfg; } - public RevisionInfoQueryCreator getRevisionInfoQueryGenerator() { + public RevisionInfoQueryCreator getRevisionInfoQueryCreator() { return revisionInfoQueryCreator; } Modified: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-16 12:44:50 UTC (rev 110) @@ -24,7 +24,7 @@ import org.jboss.envers.tools.reflection.YClass; import org.jboss.envers.tools.reflection.YProperty; import org.jboss.envers.tools.reflection.YReflectionManager; -import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; +import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; import org.jboss.envers.Versioned; import org.jboss.envers.VersionsTable; import org.jboss.envers.SecondaryVersionsTable; Copied: trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java (from rev 104, trunk/src/main/org/jboss/envers/configuration/metadata/data/PersistentClassVersioningData.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java 2008-08-16 12:44:50 UTC (rev 110) @@ -0,0 +1,49 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.metadata; + +import org.jboss.envers.ModificationStore; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Adam Warski (adam at warski dot org) +*/ +public class PersistentClassVersioningData { + public PersistentClassVersioningData() { + propertyStoreInfo = new PropertyStoreInfo(new HashMap()); + secondaryTableDictionary = new HashMap(); + } + + public PropertyStoreInfo propertyStoreInfo; + public String versionsTableName; + public String schema; + public String catalog; + public Map secondaryTableDictionary; + + public boolean isVersioned() { + if (propertyStoreInfo.propertyStores.size() > 0) { return true; } + if (propertyStoreInfo.defaultStore != null) { return true; } + return false; + } +} Copied: trunk/src/main/org/jboss/envers/configuration/metadata/PropertyStoreInfo.java (from rev 103, trunk/src/main/org/jboss/envers/configuration/metadata/data/PropertyStoreInfo.java) =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/PropertyStoreInfo.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/PropertyStoreInfo.java 2008-08-16 12:44:50 UTC (rev 110) @@ -0,0 +1,46 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.configuration.metadata; + +import org.jboss.envers.ModificationStore; + +import java.util.Map; + +/** + * @author Adam Warski (adam at warski dot org) +*/ +public class PropertyStoreInfo { + // Not null if the whole class is versioned + public ModificationStore defaultStore; + + // Maps property names to their stores defined in per-field versioned annotations + public Map propertyStores; + + public PropertyStoreInfo(Map propertyStores) { + this.propertyStores = propertyStores; + } + + public PropertyStoreInfo(ModificationStore defaultStore, Map propertyStores) { + this.defaultStore = defaultStore; + this.propertyStores = propertyStores; + } +} Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-16 12:44:50 UTC (rev 110) @@ -44,8 +44,8 @@ import org.jboss.envers.ModificationStore; import org.jboss.envers.tools.log.YLog; import org.jboss.envers.tools.log.YLogManager; -import org.jboss.envers.configuration.metadata.data.PersistentClassVersioningData; -import org.jboss.envers.configuration.metadata.data.PropertyStoreInfo; +import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; +import org.jboss.envers.configuration.metadata.PropertyStoreInfo; import org.jboss.envers.exception.VersionsException; import java.util.Iterator; Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java 2008-08-16 12:44:50 UTC (rev 110) @@ -37,9 +37,9 @@ * @author Adam Warski (adam at warski dot org) */ public class OneToManyIdMapper implements PropertyMapper { - private String owningReferencePropertyName; - private String owningEntityName; - private String propertyName; + private final String owningReferencePropertyName; + private final String owningEntityName; + private final String propertyName; public OneToManyIdMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { this.owningReferencePropertyName = owningReferencePropertyName; Modified: trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java 2008-08-16 12:44:50 UTC (rev 110) @@ -36,9 +36,9 @@ * @author Adam Warski (adam at warski dot org) */ public class ToOneIdMapper implements PropertyMapper { - private IdMapper delegate; - private String propertyName; - private String referencedEntityName; + private final IdMapper delegate; + private final String propertyName; + private final String referencedEntityName; public ToOneIdMapper(IdMapper delegate, String propertyName, String referencedEntityName) { this.delegate = delegate; Modified: trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java =================================================================== --- trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-16 12:44:50 UTC (rev 110) @@ -26,16 +26,19 @@ import org.jboss.envers.query.impl.RevisionsOfEntityQuery; import static org.jboss.envers.tools.ArgumentsTools.*; import org.jboss.envers.configuration.VersionsConfiguration; +import org.hibernate.Session; /** * @author Adam Warski (adam at warski dot org) */ public class VersionsQueryCreator { private final VersionsConfiguration verCfg; + private final Session session; private final VersionsReaderImplementor versionsReaderImplementor; - public VersionsQueryCreator(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReaderImplementor) { + public VersionsQueryCreator(VersionsConfiguration verCfg, Session session, VersionsReaderImplementor versionsReaderImplementor) { this.verCfg = verCfg; + this.session = session; this.versionsReaderImplementor = versionsReaderImplementor; } @@ -51,7 +54,7 @@ public VersionsQuery forEntitiesAtRevision(Class c, Number revision) { checkNotNull(revision, "Entity revision"); checkPositive(revision, "Entity revision"); - return new EntitiesAtRevisionQuery(verCfg, versionsReaderImplementor, c, revision); + return new EntitiesAtRevisionQuery(verCfg, session, versionsReaderImplementor, c, revision); } /** @@ -70,6 +73,6 @@ * unless an order or projection is added. */ public VersionsQuery forRevisionsOfEntity(Class c, boolean selectEntitiesOnly, boolean selectDeletedEntities) { - return new RevisionsOfEntityQuery(verCfg, versionsReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities); + return new RevisionsOfEntityQuery(verCfg, session, versionsReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities); } } Modified: trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-16 12:44:50 UTC (rev 110) @@ -31,10 +31,7 @@ import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Order; -import org.hibernate.Criteria; -import org.hibernate.FlushMode; -import org.hibernate.CacheMode; -import org.hibernate.LockMode; +import org.hibernate.*; import javax.persistence.NonUniqueResultException; import javax.persistence.NoResultException; @@ -58,7 +55,8 @@ protected final VersionsConfiguration verCfg; - protected AbstractVersionsQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, Class cls) { + protected AbstractVersionsQuery(VersionsConfiguration verCfg, Session session, + VersionsReaderImplementor versionsReader, Class cls) { this.verCfg = verCfg; criterions = new ArrayList(); @@ -66,7 +64,7 @@ entityName = cls.getName(); versionsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(entityName); - versionsCriteria = versionsReader.getSession().createCriteria(versionsEntityName, "e"); + versionsCriteria = session.createCriteria(versionsEntityName, "e"); } public abstract List list() throws VersionsException; Modified: trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-16 12:44:50 UTC (rev 110) @@ -27,6 +27,7 @@ import org.jboss.envers.configuration.VersionsEntitiesConfiguration; import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.*; +import org.hibernate.Session; import java.util.List; import java.util.ArrayList; @@ -37,9 +38,10 @@ public class EntitiesAtRevisionQuery extends AbstractVersionsQuery { private Number revision; - public EntitiesAtRevisionQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, Class cls, + public EntitiesAtRevisionQuery(VersionsConfiguration verCfg, Session session, + VersionsReaderImplementor versionsReader, Class cls, Number revision) { - super(verCfg, versionsReader, cls); + super(verCfg, session, versionsReader, cls); this.revision = revision; } Modified: trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-16 12:44:50 UTC (rev 110) @@ -29,6 +29,7 @@ import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Order; import org.hibernate.criterion.Property; +import org.hibernate.Session; import java.util.List; import java.util.ArrayList; @@ -41,9 +42,11 @@ private final boolean selectEntitiesOnly; private final boolean selectDeletedEntities; - public RevisionsOfEntityQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, - Class cls, boolean selectEntitiesOnly, boolean selectDeletedEntities) { - super(verCfg, versionsReader, cls); + public RevisionsOfEntityQuery(VersionsConfiguration verCfg, Session session, + VersionsReaderImplementor versionsReader, + Class cls, boolean selectEntitiesOnly, + boolean selectDeletedEntities) { + super(verCfg, session, versionsReader, cls); this.selectEntitiesOnly = selectEntitiesOnly; this.selectDeletedEntities = selectDeletedEntities; Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-16 12:44:50 UTC (rev 110) @@ -64,10 +64,6 @@ return sessionImplementor; } - public Session getSession() { - return session; - } - @SuppressWarnings({"unchecked"}) public T find(Class cls, Object primaryKey, Number revision) throws IllegalArgumentException, NotVersionedException, IllegalStateException { @@ -119,7 +115,7 @@ checkPositive(revision, "Entity revision"); checkSession(); - Query query = verCfg.getRevisionInfoQueryGenerator().getRevisionDateQuery(session, revision); + Query query = verCfg.getRevisionInfoQueryCreator().getRevisionDateQuery(session, revision); try { Long timestamp = (Long) query.uniqueResult(); @@ -137,7 +133,7 @@ checkNotNull(date, "Date of revision"); checkSession(); - Query query = verCfg.getRevisionInfoQueryGenerator().getRevisionNumberForDateQuery(session, date); + Query query = verCfg.getRevisionInfoQueryCreator().getRevisionNumberForDateQuery(session, date); try { Number res = (Number) query.uniqueResult(); @@ -158,7 +154,7 @@ checkPositive(revision, "Entity revision"); checkSession(); - Query query = verCfg.getRevisionInfoQueryGenerator().getRevisionQuery(session, revision); + Query query = verCfg.getRevisionInfoQueryCreator().getRevisionQuery(session, revision); try { T revisionData = (T) query.uniqueResult(); @@ -174,6 +170,6 @@ } public VersionsQueryCreator createQuery() { - return new VersionsQueryCreator(verCfg, this); + return new VersionsQueryCreator(verCfg, session, this); } } Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-16 12:44:50 UTC (rev 110) @@ -22,9 +22,7 @@ package org.jboss.envers.reader; import org.hibernate.engine.SessionImplementor; -import org.hibernate.Session; import org.jboss.envers.VersionsReader; -import org.jboss.envers.configuration.VersionsConfiguration; /** * An interface exposed by a VersionsReader to library-facing classes. @@ -32,6 +30,4 @@ */ public interface VersionsReaderImplementor extends VersionsReader { SessionImplementor getSessionImplementor(); - - Session getSession(); } Modified: trunk/src/main/org/jboss/envers/reader/lazy/ToOneDelegateSessionImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/ToOneDelegateSessionImplementor.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/reader/lazy/ToOneDelegateSessionImplementor.java 2008-08-16 12:44:50 UTC (rev 110) @@ -28,10 +28,10 @@ * @author Adam Warski (adam at warski dot org) */ public class ToOneDelegateSessionImplementor extends AbstractDelegateSessionImplementor { - private VersionsReaderImplementor versionsReader; - private Class entityClass; - private Object entityId; - private Number revision; + private final VersionsReaderImplementor versionsReader; + private final Class entityClass; + private final Object entityId; + private final Number revision; public ToOneDelegateSessionImplementor(VersionsReaderImplementor versionsReader, Class entityClass, Object entityId, Number revision) { Modified: trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoQueryCreator.java 2008-08-16 12:44:50 UTC (rev 110) @@ -14,7 +14,7 @@ private final String revisionQuery; public RevisionInfoQueryCreator(String revisionInfoEntityName, String revisionInfoIdName, - String revisionInfoTimestampName) { + String revisionInfoTimestampName) { revisionDateQuery = new StringBuilder() .append("select rev.").append(revisionInfoTimestampName) .append(" from ").append(revisionInfoEntityName) From jboss-envers-commits at lists.jboss.org Sat Aug 16 13:39:06 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 16 Aug 2008 13:39:06 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r111 - in trunk/src/main/org/jboss/envers: configuration and 7 other directories. Message-ID: Author: adamw Date: 2008-08-16 13:39:05 -0400 (Sat, 16 Aug 2008) New Revision: 111 Added: trunk/src/main/org/jboss/envers/entities/ trunk/src/main/org/jboss/envers/entities/RelationDescription.java trunk/src/main/org/jboss/envers/mapper/relation/ trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java Removed: trunk/src/main/org/jboss/envers/configuration/entities/ trunk/src/main/org/jboss/envers/mapper/id/relation/ trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java trunk/src/main/org/jboss/envers/entities/IdMappingData.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/mapper/id/QueryParameterData.java trunk/src/main/org/jboss/envers/mapper/relation/OneToOneIdMapper.java trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java Log: ENVERS-37: moving packages to more logical places Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-16 17:39:05 UTC (rev 111) @@ -27,7 +27,7 @@ import org.jboss.envers.configuration.metadata.VersionsMetadataGenerator; import org.jboss.envers.configuration.metadata.AnnotationsMetadataReader; import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; -import org.jboss.envers.configuration.entities.EntitiesConfigurations; +import org.jboss.envers.entities.EntitiesConfigurations; import org.jboss.envers.synchronization.VersionsSyncManager; import org.jboss.envers.tools.graph.GraphTopologicalSort; import org.jboss.envers.tools.reflection.YReflectionManager; Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-16 17:39:05 UTC (rev 111) @@ -30,14 +30,14 @@ import org.dom4j.DocumentHelper; import org.dom4j.Attribute; import org.dom4j.tree.DefaultElement; -import org.jboss.envers.configuration.entities.EntityConfiguration; -import org.jboss.envers.configuration.entities.IdMappingData; +import org.jboss.envers.entities.EntityConfiguration; +import org.jboss.envers.entities.IdMappingData; import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.mapper.*; import org.jboss.envers.mapper.id.*; -import org.jboss.envers.mapper.id.relation.ToOneIdMapper; -import org.jboss.envers.mapper.id.relation.OneToOneIdMapper; -import org.jboss.envers.mapper.id.relation.OneToManyIdMapper; +import org.jboss.envers.mapper.relation.ToOneIdMapper; +import org.jboss.envers.mapper.relation.OneToOneIdMapper; +import org.jboss.envers.mapper.relation.OneToManyIdMapper; import org.jboss.envers.tools.StringTools; import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.HibernateVersion; Copied: trunk/src/main/org/jboss/envers/entities (from rev 109, trunk/src/main/org/jboss/envers/configuration/entities) Modified: trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/entities/EntitiesConfigurations.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java 2008-08-16 17:39:05 UTC (rev 111) @@ -19,11 +19,10 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.configuration.entities; +package org.jboss.envers.entities; import org.jboss.envers.mapper.id.IdMapper; import org.jboss.envers.mapper.ExtendedPropertyMapper; -import org.jboss.envers.configuration.RelationDescription; import java.util.Map; import java.util.HashMap; Modified: trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/entities/EntityConfiguration.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-16 17:39:05 UTC (rev 111) @@ -19,9 +19,9 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.configuration.entities; +package org.jboss.envers.entities; -import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.mapper.ExtendedPropertyMapper; import org.jboss.envers.mapper.id.IdMapper; Modified: trunk/src/main/org/jboss/envers/entities/IdMappingData.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/entities/IdMappingData.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/entities/IdMappingData.java 2008-08-16 17:39:05 UTC (rev 111) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.configuration.entities; +package org.jboss.envers.entities; import org.jboss.envers.mapper.id.IdMapper; import org.dom4j.Element; Copied: trunk/src/main/org/jboss/envers/entities/RelationDescription.java (from rev 109, trunk/src/main/org/jboss/envers/configuration/RelationDescription.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/RelationDescription.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/RelationDescription.java 2008-08-16 17:39:05 UTC (rev 111) @@ -0,0 +1,53 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities; + +import org.jboss.envers.mapper.id.IdMapper; + +/** + * @author Adam Warski (adam at warski dot org) +*/ +public class RelationDescription { + public final String fromPropertyName; + public final RelationType relationType; + public final String toEntityName; + public final String mappedByPropertyName; + public final IdMapper idMapper; + public boolean bidirectional; + + public RelationDescription(String fromPropertyName, RelationType relationType, String toEntityName, + String mappedByPropertyName, IdMapper idMapper) { + this.fromPropertyName = fromPropertyName; + this.relationType = relationType; + this.toEntityName = toEntityName; + this.mappedByPropertyName = mappedByPropertyName; + this.idMapper = idMapper; + + this.bidirectional = false; + } + + public static enum RelationType { + TO_ONE, + ONE_TO_ONE, + ONE_TO_MANY + } +} Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-16 17:39:05 UTC (rev 111) @@ -25,7 +25,7 @@ import org.hibernate.cfg.Configuration; import org.hibernate.persister.entity.EntityPersister; import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.synchronization.VersionsSync; import org.jboss.envers.synchronization.work.AddWorkUnit; import org.jboss.envers.synchronization.work.ModWorkUnit; Modified: trunk/src/main/org/jboss/envers/mapper/id/QueryParameterData.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/QueryParameterData.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/mapper/id/QueryParameterData.java 2008-08-16 17:39:05 UTC (rev 111) @@ -21,8 +21,6 @@ */ package org.jboss.envers.mapper.id; -import org.hibernate.Query; - /** * @author Adam Warski (adam at warski dot org) */ @@ -35,11 +33,6 @@ this.value = value; } - public void appendProperty(StringBuilder queryStr, String prefix) { - queryStr.append(prefix).append("."); - queryStr.append(flatEntityPropertyName); - } - public String getProperty(String prefix) { if (prefix != null) { return prefix + "." + flatEntityPropertyName; @@ -51,13 +44,4 @@ public Object getValue() { return value; } - - public void appendPropertyWithParameter(StringBuilder queryStr, String prefix) { - appendProperty(queryStr, prefix); - queryStr.append(" = :").append(flatEntityPropertyName); - } - - public void setQueryParameter(Query query) { - query.setParameter(flatEntityPropertyName, value); - } } Copied: trunk/src/main/org/jboss/envers/mapper/relation (from rev 109, trunk/src/main/org/jboss/envers/mapper/id/relation) Deleted: trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) @@ -1,80 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.mapper.id.relation; - -import org.jboss.envers.mapper.PropertyMapper; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.reader.lazy.OneToManyInitializor; -import org.jboss.envers.reader.lazy.proxy.ListProxy; -import org.jboss.envers.reader.lazy.proxy.SetProxy; -import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.tools.reflection.ReflectionTools; -import org.hibernate.property.Setter; -import org.hibernate.property.Getter; - -import java.util.*; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyIdMapper implements PropertyMapper { - private String owningReferencePropertyName; - private String owningEntityName; - private String propertyName; - - public OneToManyIdMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { - this.owningReferencePropertyName = owningReferencePropertyName; - this.owningEntityName = owningEntityName; - this.propertyName = propertyName; - } - - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - return false; - } - - @SuppressWarnings({"unchecked"}) - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { - if (obj == null) { - return; - } - - Class entityClass = ReflectionTools.loadClass(owningEntityName); - - Getter getter = ReflectionTools.getGetter(obj.getClass(), propertyName); - Class collectionClass = getter.getReturnType(); - - // todo: investigate generics - Object value; - if (List.class.isAssignableFrom(collectionClass)) { - value = new ListProxy(new OneToManyInitializor(versionsReader, entityClass, - owningReferencePropertyName, primaryKey, revision, ArrayList.class)); - } else if (Set.class.isAssignableFrom(collectionClass) || Collection.class.isAssignableFrom(collectionClass)) { - value = new SetProxy(new OneToManyInitializor(versionsReader, entityClass, - owningReferencePropertyName, primaryKey, revision, HashSet.class)); - } else { - throw new VersionsException("Unsupported versioned collection type: " + collectionClass.getName()); - } - - Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); - setter.set(obj, value, null); - } -} \ No newline at end of file Copied: trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java (from rev 110, trunk/src/main/org/jboss/envers/mapper/id/relation/OneToManyIdMapper.java) =================================================================== --- trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) @@ -0,0 +1,80 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.mapper.relation; + +import org.jboss.envers.mapper.PropertyMapper; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.reader.lazy.OneToManyInitializor; +import org.jboss.envers.reader.lazy.proxy.ListProxy; +import org.jboss.envers.reader.lazy.proxy.SetProxy; +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.tools.reflection.ReflectionTools; +import org.hibernate.property.Setter; +import org.hibernate.property.Getter; + +import java.util.*; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyIdMapper implements PropertyMapper { + private final String owningReferencePropertyName; + private final String owningEntityName; + private final String propertyName; + + public OneToManyIdMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { + this.owningReferencePropertyName = owningReferencePropertyName; + this.owningEntityName = owningEntityName; + this.propertyName = propertyName; + } + + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + return false; + } + + @SuppressWarnings({"unchecked"}) + public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + if (obj == null) { + return; + } + + Class entityClass = ReflectionTools.loadClass(owningEntityName); + + Getter getter = ReflectionTools.getGetter(obj.getClass(), propertyName); + Class collectionClass = getter.getReturnType(); + + // todo: investigate generics + Object value; + if (List.class.isAssignableFrom(collectionClass)) { + value = new ListProxy(new OneToManyInitializor(versionsReader, entityClass, + owningReferencePropertyName, primaryKey, revision, ArrayList.class)); + } else if (Set.class.isAssignableFrom(collectionClass) || Collection.class.isAssignableFrom(collectionClass)) { + value = new SetProxy(new OneToManyInitializor(versionsReader, entityClass, + owningReferencePropertyName, primaryKey, revision, HashSet.class)); + } else { + throw new VersionsException("Unsupported versioned collection type: " + collectionClass.getName()); + } + + Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); + setter.set(obj, value, null); + } +} \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/mapper/relation/OneToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/OneToOneIdMapper.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/mapper/relation/OneToOneIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id.relation; +package org.jboss.envers.mapper.relation; import org.jboss.envers.mapper.PropertyMapper; import org.jboss.envers.reader.VersionsReaderImplementor; Deleted: trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java 2008-08-16 12:33:03 UTC (rev 109) +++ trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) @@ -1,82 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.mapper.id.relation; - -import org.jboss.envers.mapper.PropertyMapper; -import org.jboss.envers.mapper.id.IdMapper; -import org.jboss.envers.tools.Tools; -import org.jboss.envers.tools.reflection.ReflectionTools; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.reader.lazy.ToOneDelegateSessionImplementor; -import org.hibernate.property.Setter; - -import java.util.Map; -import java.util.HashMap; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class ToOneIdMapper implements PropertyMapper { - private IdMapper delegate; - private String propertyName; - private String referencedEntityName; - - public ToOneIdMapper(IdMapper delegate, String propertyName, String referencedEntityName) { - this.delegate = delegate; - this.propertyName = propertyName; - this.referencedEntityName = referencedEntityName; - } - - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - HashMap newData = new HashMap(); - data.put(propertyName, newData); - - delegate.mapToMapFromEntity(newData, newObj); - - return !Tools.objectsEqual(newObj, oldObj); - } - - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, - VersionsReaderImplementor versionsReader, Number revision) { - if (obj == null) { - return; - } - - Object entityId = delegate.mapToIdFromMap((Map) data.get(propertyName)); - doMap(obj, versionsReader, revision, entityId); - } - - private void doMap(Object obj, VersionsReaderImplementor versionsReader, Number revision, Object entityId) { - Object value; - if (entityId == null) { - value = null; - } else { - Class entityClass = ReflectionTools.loadClass(referencedEntityName); - - value = versionsReader.getSessionImplementor().getFactory().getEntityPersister(referencedEntityName). - createProxy(null, new ToOneDelegateSessionImplementor(versionsReader, entityClass, entityId, revision)); - } - - Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); - setter.set(obj, value, null); - } -} Copied: trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java (from rev 110, trunk/src/main/org/jboss/envers/mapper/id/relation/ToOneIdMapper.java) =================================================================== --- trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) @@ -0,0 +1,82 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.mapper.relation; + +import org.jboss.envers.mapper.PropertyMapper; +import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.tools.Tools; +import org.jboss.envers.tools.reflection.ReflectionTools; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.reader.lazy.ToOneDelegateSessionImplementor; +import org.hibernate.property.Setter; + +import java.util.Map; +import java.util.HashMap; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class ToOneIdMapper implements PropertyMapper { + private final IdMapper delegate; + private final String propertyName; + private final String referencedEntityName; + + public ToOneIdMapper(IdMapper delegate, String propertyName, String referencedEntityName) { + this.delegate = delegate; + this.propertyName = propertyName; + this.referencedEntityName = referencedEntityName; + } + + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + HashMap newData = new HashMap(); + data.put(propertyName, newData); + + delegate.mapToMapFromEntity(newData, newObj); + + return !Tools.objectsEqual(newObj, oldObj); + } + + public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, + VersionsReaderImplementor versionsReader, Number revision) { + if (obj == null) { + return; + } + + Object entityId = delegate.mapToIdFromMap((Map) data.get(propertyName)); + doMap(obj, versionsReader, revision, entityId); + } + + private void doMap(Object obj, VersionsReaderImplementor versionsReader, Number revision, Object entityId) { + Object value; + if (entityId == null) { + value = null; + } else { + Class entityClass = ReflectionTools.loadClass(referencedEntityName); + + value = versionsReader.getSessionImplementor().getFactory().getEntityPersister(referencedEntityName). + createProxy(null, new ToOneDelegateSessionImplementor(versionsReader, entityClass, entityId, revision)); + } + + Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); + setter.set(obj, value, null); + } +} Modified: trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java 2008-08-16 17:39:05 UTC (rev 111) @@ -22,7 +22,7 @@ package org.jboss.envers.query.criteria; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.configuration.VersionsConfiguration; /** Modified: trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java 2008-08-16 17:39:05 UTC (rev 111) @@ -24,7 +24,7 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.configuration.VersionsConfiguration; /** Modified: trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java 2008-08-16 17:39:05 UTC (rev 111) @@ -24,7 +24,7 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Restrictions; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.configuration.VersionsConfiguration; /** Modified: trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java 2008-08-16 17:39:05 UTC (rev 111) @@ -23,7 +23,7 @@ import org.hibernate.criterion.Criterion; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.configuration.VersionsConfiguration; /** Modified: trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java =================================================================== --- trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java 2008-08-16 17:39:05 UTC (rev 111) @@ -23,7 +23,7 @@ import org.hibernate.criterion.Criterion; import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.RelationDescription; +import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.configuration.VersionsConfiguration; /** From jboss-envers-commits at lists.jboss.org Sat Aug 16 13:42:15 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 16 Aug 2008 13:42:15 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r112 - in trunk/src/main/org/jboss/envers: configuration and 7 other directories. Message-ID: Author: adamw Date: 2008-08-16 13:42:15 -0400 (Sat, 16 Aug 2008) New Revision: 112 Added: trunk/src/main/org/jboss/envers/entities/mapper/ trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java trunk/src/main/org/jboss/envers/entities/mapper/relation/ Removed: trunk/src/main/org/jboss/envers/configuration/RelationDescription.java trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java trunk/src/main/org/jboss/envers/entities/mapper/id/relation/ trunk/src/main/org/jboss/envers/mapper/ Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java trunk/src/main/org/jboss/envers/entities/IdMappingData.java trunk/src/main/org/jboss/envers/entities/RelationDescription.java trunk/src/main/org/jboss/envers/entities/mapper/CompositeMapperBuilder.java trunk/src/main/org/jboss/envers/entities/mapper/CompositePropertyMapperBuilder.java trunk/src/main/org/jboss/envers/entities/mapper/ExtendedPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/SimpleMapperBuilder.java trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractCompositeIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/EmbeddedIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/MultipleIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/SimpleIdMapperBuilder.java trunk/src/main/org/jboss/envers/entities/mapper/id/SingleIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java Log: ENVERS-37: moving packages to more logical places Deleted: trunk/src/main/org/jboss/envers/configuration/RelationDescription.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/RelationDescription.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/configuration/RelationDescription.java 2008-08-16 17:42:15 UTC (rev 112) @@ -1,53 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.configuration; - -import org.jboss.envers.mapper.id.IdMapper; - -/** - * @author Adam Warski (adam at warski dot org) -*/ -public class RelationDescription { - public String fromPropertyName; - public RelationType relationType; - public String toEntityName; - public String mappedByPropertyName; - public IdMapper idMapper; - public boolean bidirectional; - - public RelationDescription(String fromPropertyName, RelationType relationType, String toEntityName, - String mappedByPropertyName, IdMapper idMapper) { - this.fromPropertyName = fromPropertyName; - this.relationType = relationType; - this.toEntityName = toEntityName; - this.mappedByPropertyName = mappedByPropertyName; - this.idMapper = idMapper; - - this.bidirectional = false; - } - - public static enum RelationType { - TO_ONE, - ONE_TO_ONE, - ONE_TO_MANY - } -} Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-16 17:42:15 UTC (rev 112) @@ -33,11 +33,11 @@ import org.jboss.envers.entities.EntityConfiguration; import org.jboss.envers.entities.IdMappingData; import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.mapper.*; -import org.jboss.envers.mapper.id.*; -import org.jboss.envers.mapper.relation.ToOneIdMapper; -import org.jboss.envers.mapper.relation.OneToOneIdMapper; -import org.jboss.envers.mapper.relation.OneToManyIdMapper; +import org.jboss.envers.entities.mapper.*; +import org.jboss.envers.entities.mapper.id.*; +import org.jboss.envers.entities.mapper.relation.ToOneIdMapper; +import org.jboss.envers.entities.mapper.relation.OneToOneIdMapper; +import org.jboss.envers.entities.mapper.relation.OneToManyIdMapper; import org.jboss.envers.tools.StringTools; import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.HibernateVersion; Modified: trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java 2008-08-16 17:42:15 UTC (rev 112) @@ -21,8 +21,8 @@ */ package org.jboss.envers.entities; -import org.jboss.envers.mapper.id.IdMapper; -import org.jboss.envers.mapper.ExtendedPropertyMapper; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.ExtendedPropertyMapper; import java.util.Map; import java.util.HashMap; Modified: trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-16 17:42:15 UTC (rev 112) @@ -22,8 +22,8 @@ package org.jboss.envers.entities; import org.jboss.envers.entities.RelationDescription; -import org.jboss.envers.mapper.ExtendedPropertyMapper; -import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.ExtendedPropertyMapper; +import org.jboss.envers.entities.mapper.id.IdMapper; import java.util.Map; import java.util.HashMap; Modified: trunk/src/main/org/jboss/envers/entities/IdMappingData.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/IdMappingData.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/IdMappingData.java 2008-08-16 17:42:15 UTC (rev 112) @@ -21,7 +21,7 @@ */ package org.jboss.envers.entities; -import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.id.IdMapper; import org.dom4j.Element; /** Modified: trunk/src/main/org/jboss/envers/entities/RelationDescription.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/RelationDescription.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/RelationDescription.java 2008-08-16 17:42:15 UTC (rev 112) @@ -21,7 +21,7 @@ */ package org.jboss.envers.entities; -import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.id.IdMapper; /** * @author Adam Warski (adam at warski dot org) Copied: trunk/src/main/org/jboss/envers/entities/mapper (from rev 110, trunk/src/main/org/jboss/envers/mapper) Modified: trunk/src/main/org/jboss/envers/entities/mapper/CompositeMapperBuilder.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/CompositeMapperBuilder.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/CompositeMapperBuilder.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; /** * @author Adam Warski (adam at warski dot org) Modified: trunk/src/main/org/jboss/envers/entities/mapper/CompositePropertyMapperBuilder.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/CompositePropertyMapperBuilder.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/CompositePropertyMapperBuilder.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; /** * @author Adam Warski (adam at warski dot org) Modified: trunk/src/main/org/jboss/envers/entities/mapper/ExtendedPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/ExtendedPropertyMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/ExtendedPropertyMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; import java.util.Map; Modified: trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/MapPropertyMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; import org.jboss.envers.ModificationStore; import org.jboss.envers.tools.reflection.ReflectionTools; Modified: trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/MultiPropertyMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; import org.hibernate.property.Getter; import org.hibernate.MappingException; Modified: trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/PropertyMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; import org.jboss.envers.reader.VersionsReaderImplementor; Modified: trunk/src/main/org/jboss/envers/entities/mapper/SimpleMapperBuilder.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/SimpleMapperBuilder.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/SimpleMapperBuilder.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; import org.jboss.envers.ModificationStore; Modified: trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/SinglePropertyMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; import org.jboss.envers.ModificationStore; import org.jboss.envers.tools.reflection.ReflectionTools; Modified: trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/SubclassPropertyMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper; +package org.jboss.envers.entities.mapper; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.ModificationStore; Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractCompositeIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/AbstractCompositeIdMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractCompositeIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id; +package org.jboss.envers.entities.mapper.id; import org.jboss.envers.ModificationStore; import org.jboss.envers.exception.VersionsException; Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/AbstractIdMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id; +package org.jboss.envers.entities.mapper.id; import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Criterion; Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/EmbeddedIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/EmbeddedIdMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/EmbeddedIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id; +package org.jboss.envers.entities.mapper.id; import org.hibernate.property.Getter; import org.hibernate.property.Setter; Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/IdMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id; +package org.jboss.envers.entities.mapper.id; import org.hibernate.criterion.Criterion; Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/MultipleIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/MultipleIdMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/MultipleIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id; +package org.jboss.envers.entities.mapper.id; import org.jboss.envers.exception.VersionsException; Deleted: trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/QueryParameterData.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java 2008-08-16 17:42:15 UTC (rev 112) @@ -1,63 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.mapper.id; - -import org.hibernate.Query; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class QueryParameterData { - private String flatEntityPropertyName; - private Object value; - - public QueryParameterData(String flatEntityPropertyName, Object value) { - this.flatEntityPropertyName = flatEntityPropertyName; - this.value = value; - } - - public void appendProperty(StringBuilder queryStr, String prefix) { - queryStr.append(prefix).append("."); - queryStr.append(flatEntityPropertyName); - } - - public String getProperty(String prefix) { - if (prefix != null) { - return prefix + "." + flatEntityPropertyName; - } else { - return flatEntityPropertyName; - } - } - - public Object getValue() { - return value; - } - - public void appendPropertyWithParameter(StringBuilder queryStr, String prefix) { - appendProperty(queryStr, prefix); - queryStr.append(" = :").append(flatEntityPropertyName); - } - - public void setQueryParameter(Query query) { - query.setParameter(flatEntityPropertyName, value); - } -} Copied: trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java (from rev 111, trunk/src/main/org/jboss/envers/mapper/id/QueryParameterData.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java 2008-08-16 17:42:15 UTC (rev 112) @@ -0,0 +1,47 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.id; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class QueryParameterData { + private String flatEntityPropertyName; + private Object value; + + public QueryParameterData(String flatEntityPropertyName, Object value) { + this.flatEntityPropertyName = flatEntityPropertyName; + this.value = value; + } + + public String getProperty(String prefix) { + if (prefix != null) { + return prefix + "." + flatEntityPropertyName; + } else { + return flatEntityPropertyName; + } + } + + public Object getValue() { + return value; + } +} Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/SimpleIdMapperBuilder.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/SimpleIdMapperBuilder.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/SimpleIdMapperBuilder.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,9 +19,9 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id; +package org.jboss.envers.entities.mapper.id; -import org.jboss.envers.mapper.SimpleMapperBuilder; +import org.jboss.envers.entities.mapper.SimpleMapperBuilder; /** * @author Adam Warski (adam at warski dot org) Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/SingleIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/id/SingleIdMapper.java 2008-08-16 12:44:50 UTC (rev 110) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/SingleIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.id; +package org.jboss.envers.entities.mapper.id; import org.jboss.envers.ModificationStore; import org.jboss.envers.tools.reflection.ReflectionTools; Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation (from rev 111, trunk/src/main/org/jboss/envers/mapper/relation) Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/relation/OneToManyIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,9 +19,9 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.relation; +package org.jboss.envers.entities.mapper.relation; -import org.jboss.envers.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PropertyMapper; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.reader.lazy.OneToManyInitializor; import org.jboss.envers.reader.lazy.proxy.ListProxy; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/relation/OneToOneIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,9 +19,9 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.relation; +package org.jboss.envers.entities.mapper.relation; -import org.jboss.envers.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PropertyMapper; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.query.VersionsRestrictions; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/mapper/relation/ToOneIdMapper.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) @@ -19,10 +19,10 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.mapper.relation; +package org.jboss.envers.entities.mapper.relation; -import org.jboss.envers.mapper.PropertyMapper; -import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.id.IdMapper; import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; Modified: trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java =================================================================== --- trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java 2008-08-16 17:42:15 UTC (rev 112) @@ -23,7 +23,7 @@ import org.jboss.envers.exception.VersionsException; import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.id.IdMapper; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.tools.reflection.ReflectionTools; Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-16 17:42:15 UTC (rev 112) @@ -32,7 +32,7 @@ import org.jboss.envers.synchronization.work.DelWorkUnit; import org.jboss.envers.synchronization.work.CollectionChangeWorkUnit; import org.jboss.envers.tools.Tools; -import org.jboss.envers.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.id.IdMapper; import java.io.Serializable; From jboss-envers-commits at lists.jboss.org Sun Aug 17 10:24:37 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sun, 17 Aug 2008 10:24:37 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r113 - in trunk/src/main/org/jboss/envers: configuration and 13 other directories. Message-ID: Author: adamw Date: 2008-08-17 10:24:36 -0400 (Sun, 17 Aug 2008) New Revision: 113 Added: trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java trunk/src/main/org/jboss/envers/entities/RevisionTypeType.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/ Removed: trunk/src/main/org/jboss/envers/entity/ Modified: trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/IdMappingData.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/AbstractDelegateSessionImplementor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/CollectionProxy.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/Initializor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/ListProxy.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/SetProxy.java trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java trunk/src/main/org/jboss/envers/tools/graph/Vertex.java trunk/src/main/org/jboss/envers/tools/log/YLog.java trunk/src/main/org/jboss/envers/tools/log/YLogManager.java trunk/src/main/org/jboss/envers/tools/reflection/YClass.java trunk/src/main/org/jboss/envers/tools/reflection/YMethodsAndClasses.java trunk/src/main/org/jboss/envers/tools/reflection/YProperty.java trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java Log: ENVERS-37: moving packages to more logical places, adding final to variables Modified: trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-17 14:24:36 UTC (rev 113) @@ -170,10 +170,6 @@ revisionInfoXmlMapping, new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdName, revisionInfoTimestampName)); } - - public boolean isRevisionInfoEntityName(String entityName) { - return revisionInfoEntityName.equals(entityName); - } } class RevisionInfoConfigurationResult { Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-17 14:24:36 UTC (rev 113) @@ -52,7 +52,6 @@ private final VersionsEntitiesConfiguration verEntCfg; private final VersionsSyncManager versionsSyncManager; private final EntitiesConfigurations entCfg; - private final RevisionInfoConfiguration revInfoCfg; private final RevisionInfoQueryCreator revisionInfoQueryCreator; public VersionsEntitiesConfiguration getVerEntCfg() { @@ -63,10 +62,6 @@ return versionsSyncManager; } - public RevisionInfoConfiguration getRevInfoCfg() { - return revInfoCfg; - } - public GlobalConfiguration getGlobalCfg() { return globalCfg; } @@ -92,7 +87,7 @@ Properties properties = cfg.getProperties(); YReflectionManager reflectionManager = getReflectionManager(cfg); - revInfoCfg = new RevisionInfoConfiguration(); + RevisionInfoConfiguration revInfoCfg = new RevisionInfoConfiguration(); RevisionInfoConfigurationResult revInfoCfgResult = revInfoCfg.configure(cfg, reflectionManager); verEntCfg = new VersionsEntitiesConfiguration(properties, revInfoCfgResult.getRevisionPropType()); globalCfg = new GlobalConfiguration(properties); Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-17 14:24:36 UTC (rev 113) @@ -591,7 +591,7 @@ // Adding the "revision type" property Element revTypeProperty = MetadataTools.addProperty(class_mapping, verCfg.getVerEntCfg().getRevisionTypePropName(), verCfg.getVerEntCfg().getRevisionTypePropType(), false); - revTypeProperty.addAttribute("type", "org.jboss.envers.entity.RevisionTypeType"); + revTypeProperty.addAttribute("type", "org.jboss.envers.entities.RevisionTypeType"); break; case SINGLE: Copied: trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java (from rev 112, trunk/src/main/org/jboss/envers/entity/EntityInstantiator.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java 2008-08-17 14:24:36 UTC (rev 113) @@ -0,0 +1,90 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities; + +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.tools.reflection.ReflectionTools; + +import java.util.Map; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class EntityInstantiator { + private final VersionsConfiguration verCfg; + private final VersionsReaderImplementor versionsReader; + + public EntityInstantiator(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader) { + this.verCfg = verCfg; + this.versionsReader = versionsReader; + } + + /** + * Creates an entity instance based on an entry from the versions table. + * @param entityName Name of the entity, which instances should be read + * @param versionsEntity An entry in the versions table, from which data should be mapped. + * @param revision Revision at which this entity was read. + * @return An entity instance, with versioned properties set as in the versionsEntity map, and proxies + * created for collections. + */ + public Object createInstanceFromVersionsEntity(String entityName, Map versionsEntity, Number revision) { + if (versionsEntity == null) { + return null; + } + + // The $type$ property holds the name of the (versions) entity + String type = verCfg.getEntCfg().getEntityNameForVersionsEntityName((String) versionsEntity.get("$type$")); + + if (type != null) { + entityName = type; + } + + Object ret; + try { + Class cls = ReflectionTools.loadClass(entityName); + ret = cls.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + IdMapper idMapper = verCfg.getEntCfg().getIdMapper(entityName); + Map originalId = (Map) versionsEntity.get(verCfg.getVerEntCfg().getOriginalIdPropName()); + + Object primaryKey = idMapper.mapToIdFromMap(originalId); + + verCfg.getEntCfg().getPropertyMapper(entityName).mapToEntityFromMap(ret, versionsEntity, primaryKey, versionsReader, revision); + idMapper.mapToEntityFromMap(ret, originalId); + + return ret; + } + + @SuppressWarnings({"unchecked"}) + public void addInstancesFromVersionsEntities(String entityName, List list, List versionsEntities, Number revision) { + for (Map versionsEntity : versionsEntities) { + list.add(createInstanceFromVersionsEntity(entityName, versionsEntity, revision)); + } + } +} Modified: trunk/src/main/org/jboss/envers/entities/IdMappingData.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/IdMappingData.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/entities/IdMappingData.java 2008-08-17 14:24:36 UTC (rev 113) @@ -28,11 +28,11 @@ * @author Adam Warski (adam at warski dot org) */ public class IdMappingData { - private IdMapper idMapper; + private final IdMapper idMapper; // Mapping which will be used to generate the entity - private Element xmlMapping; + private final Element xmlMapping; // Mapping which will be used to generate references to the entity in related entities - private Element xmlRelationMapping; + private final Element xmlRelationMapping; public IdMappingData(IdMapper idMapper, Element xmlMapping, Element xmlRelationMapping) { this.idMapper = idMapper; Copied: trunk/src/main/org/jboss/envers/entities/RevisionTypeType.java (from rev 111, trunk/src/main/org/jboss/envers/entity/RevisionTypeType.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/RevisionTypeType.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/RevisionTypeType.java 2008-08-17 14:24:36 UTC (rev 113) @@ -0,0 +1,85 @@ +package org.jboss.envers.entities; + +import org.hibernate.usertype.UserType; +import org.hibernate.HibernateException; +import org.jboss.envers.RevisionType; + +import java.sql.ResultSet; +import java.sql.Types; +import java.sql.SQLException; +import java.sql.PreparedStatement; +import java.io.Serializable; + +/** + * A hibernate type for the {@link RevisionType} enum. + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionTypeType implements UserType { + private static final int[] SQL_TYPES = { Types.TINYINT }; + + public int[] sqlTypes() { + return SQL_TYPES; + } + + public Class returnedClass() { + return RevisionType.class; + } + + public RevisionType nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException { + byte representation = (byte) resultSet.getInt(names[0]); + RevisionType result = null; + + if (!resultSet.wasNull()) { + result = RevisionType.fromRepresentation(representation); + } + + return result; + } + + public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index) throws HibernateException, SQLException { + if (null == value) { + preparedStatement.setNull(index, Types.TINYINT); + } else { + preparedStatement.setInt(index, ((RevisionType) value).getRepresentation()); + } + } + + public Object deepCopy(Object value) throws HibernateException{ + return value; + } + + public boolean isMutable() { + return false; + } + + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable)value; + } + + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } + + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + public boolean equals(Object x, Object y) throws HibernateException { + //noinspection ObjectEquality + if (x == y) { + return true; + } + + if (null == x || null == y) { + return false; + } + + return x.equals(y); + } +} + + Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java 2008-08-17 14:24:36 UTC (rev 113) @@ -23,9 +23,9 @@ import org.jboss.envers.entities.mapper.PropertyMapper; import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.reader.lazy.OneToManyInitializor; -import org.jboss.envers.reader.lazy.proxy.ListProxy; -import org.jboss.envers.reader.lazy.proxy.SetProxy; +import org.jboss.envers.entities.mapper.relation.lazy.OneToManyInitializor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.ListProxy; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.SetProxy; import org.jboss.envers.exception.VersionsException; import org.jboss.envers.tools.reflection.ReflectionTools; import org.hibernate.property.Setter; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java 2008-08-17 14:24:36 UTC (rev 113) @@ -26,7 +26,7 @@ import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.reader.lazy.ToOneDelegateSessionImplementor; +import org.jboss.envers.entities.mapper.relation.lazy.ToOneDelegateSessionImplementor; import org.hibernate.property.Setter; import java.util.Map; Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy (from rev 111, trunk/src/main/org/jboss/envers/reader/lazy) Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/AbstractDelegateSessionImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/AbstractDelegateSessionImplementor.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/AbstractDelegateSessionImplementor.java 2008-08-17 14:24:36 UTC (rev 113) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reader.lazy; +package org.jboss.envers.entities.mapper.relation.lazy; import org.hibernate.engine.*; import org.hibernate.engine.query.sql.NativeSQLQuerySpecification; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/OneToManyInitializor.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java 2008-08-17 14:24:36 UTC (rev 113) @@ -19,10 +19,10 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reader.lazy; +package org.jboss.envers.entities.mapper.relation.lazy; import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.reader.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; import org.jboss.envers.query.VersionsRestrictions; import org.jboss.envers.exception.VersionsException; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/ToOneDelegateSessionImplementor.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java 2008-08-17 14:24:36 UTC (rev 113) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reader.lazy; +package org.jboss.envers.entities.mapper.relation.lazy; import org.hibernate.HibernateException; import org.jboss.envers.reader.VersionsReaderImplementor; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/CollectionProxy.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/proxy/CollectionProxy.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/CollectionProxy.java 2008-08-17 14:24:36 UTC (rev 113) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reader.lazy.proxy; +package org.jboss.envers.entities.mapper.relation.lazy.proxy; import java.util.Collection; import java.util.Iterator; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/Initializor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/proxy/Initializor.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/Initializor.java 2008-08-17 14:24:36 UTC (rev 113) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reader.lazy.proxy; +package org.jboss.envers.entities.mapper.relation.lazy.proxy; import java.util.Collection; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/ListProxy.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/proxy/ListProxy.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/ListProxy.java 2008-08-17 14:24:36 UTC (rev 113) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reader.lazy.proxy; +package org.jboss.envers.entities.mapper.relation.lazy.proxy; import java.util.List; import java.util.Collection; Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/SetProxy.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/lazy/proxy/SetProxy.java 2008-08-16 17:39:05 UTC (rev 111) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/proxy/SetProxy.java 2008-08-17 14:24:36 UTC (rev 113) @@ -19,7 +19,7 @@ * * Red Hat Author(s): Adam Warski */ -package org.jboss.envers.reader.lazy.proxy; +package org.jboss.envers.entities.mapper.relation.lazy.proxy; import java.util.Set; Modified: trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-17 14:24:36 UTC (rev 113) @@ -22,7 +22,7 @@ package org.jboss.envers.query.impl; import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.entity.EntityInstantiator; +import org.jboss.envers.entities.EntityInstantiator; import org.jboss.envers.query.criteria.VersionsCriterion; import org.jboss.envers.query.VersionsQuery; import org.jboss.envers.query.projection.VersionsProjection; Modified: trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-17 14:24:36 UTC (rev 113) @@ -36,7 +36,7 @@ * @author Adam Warski (adam at warski dot org) */ public class EntitiesAtRevisionQuery extends AbstractVersionsQuery { - private Number revision; + private final Number revision; public EntitiesAtRevisionQuery(VersionsConfiguration verCfg, Session session, VersionsReaderImplementor versionsReader, Class cls, Modified: trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java =================================================================== --- trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/query/order/RevisionVersionsOrder.java 2008-08-17 14:24:36 UTC (rev 113) @@ -28,7 +28,7 @@ * @author Adam Warski (adam at warski dot org) */ public class RevisionVersionsOrder implements VersionsOrder { - private boolean asc; + private final boolean asc; public RevisionVersionsOrder(boolean asc) { this.asc = asc; Modified: trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/query/projection/DistinctVersionsProjection.java 2008-08-17 14:24:36 UTC (rev 113) @@ -29,7 +29,7 @@ * @author Adam Warski (adam at warski dot org) */ public class DistinctVersionsProjection implements VersionsProjection { - private VersionsProjection projection; + private final VersionsProjection projection; public DistinctVersionsProjection(VersionsProjection projection) { this.projection = projection; Modified: trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/query/projection/ProjectionWrapper.java 2008-08-17 14:24:36 UTC (rev 113) @@ -29,7 +29,7 @@ * @author Adam Warski (adam at warski dot org) */ public class ProjectionWrapper implements VersionsProjection { - private Projection wrapped; + private final Projection wrapped; public ProjectionWrapper(Projection wrapped) { this.wrapped = wrapped; Modified: trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/query/projection/RevisionVersionsProjection.java 2008-08-17 14:24:36 UTC (rev 113) @@ -36,7 +36,7 @@ COUNT_DISTINCT } - private ProjectionType type; + private final ProjectionType type; public RevisionVersionsProjection(ProjectionType type) { this.type = type; Modified: trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java =================================================================== --- trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/query/projection/VersionsProjectionList.java 2008-08-17 14:24:36 UTC (rev 113) @@ -33,7 +33,7 @@ * @author Adam Warski (adam at warski dot org) */ public class VersionsProjectionList implements VersionsProjection { - private List projections; + private final List projections; public VersionsProjectionList() { projections = new ArrayList(); Modified: trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java 2008-08-17 14:24:36 UTC (rev 113) @@ -30,9 +30,9 @@ * @author Adam Warski (adam at warski dot org) */ public class CustomRevisionInfoGenerator implements RevisionInfoGenerator { - private RevisionListener listener; - private Setter revisionTimestampSetter; - private Class entityClass; + private final RevisionListener listener; + private final Setter revisionTimestampSetter; + private final Class entityClass; public CustomRevisionInfoGenerator(Class entityClass, Class listenerClass, @@ -50,6 +50,9 @@ } catch (IllegalAccessException e) { throw new MappingException(e); } + } else { + // Default listener - none + listener = null; } } Modified: trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-17 14:24:36 UTC (rev 113) @@ -28,7 +28,7 @@ * @author Adam Warski (adam at warski dot org) */ public class DefaultRevisionInfoGenerator implements RevisionInfoGenerator { - private String revisionInfoTimestampName; + private final String revisionInfoTimestampName; public DefaultRevisionInfoGenerator(String revisionInfoTimestampName) { this.revisionInfoTimestampName = revisionInfoTimestampName; Modified: trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java 2008-08-17 14:24:36 UTC (rev 113) @@ -34,11 +34,12 @@ * @author Adam Warski (adam at warski dot org) */ public abstract class AbstractVersionsWorkUnit implements VersionsWorkUnit { - protected VersionsConfiguration verCfg; - protected Serializable id; + protected final VersionsConfiguration verCfg; + protected final Serializable id; + private final String entityName; + private Object performedData; - private String entityName; protected AbstractVersionsWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id) { this.verCfg = verCfg; Modified: trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-17 14:24:36 UTC (rev 113) @@ -34,8 +34,8 @@ * @author Adam Warski (adam at warski dot org) */ public class AddWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { - private Object[] state; - private String[] propertyNames; + private final Object[] state; + private final String[] propertyNames; public AddWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id, EntityPersister entityPersister, Object[] state) { Modified: trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-17 14:24:36 UTC (rev 113) @@ -33,7 +33,7 @@ * @author Adam Warski (adam at warski dot org) */ public class CollectionChangeWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { - private Object entity; + private final Object entity; public CollectionChangeWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id, Object entity) { super(entityName, verCfg, id); Modified: trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-17 14:24:36 UTC (rev 113) @@ -34,8 +34,8 @@ * @author Adam Warski (adam at warski dot org) */ public class ModWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { - private Map data; - private boolean changes; + private final Map data; + private final boolean changes; public ModWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id, EntityPersister entityPersister, Object[] newState, Object[] oldState) { Modified: trunk/src/main/org/jboss/envers/tools/graph/Vertex.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/graph/Vertex.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/tools/graph/Vertex.java 2008-08-17 14:24:36 UTC (rev 113) @@ -29,8 +29,9 @@ * @author Adam Warski (adam at warski dot org) */ public class Vertex { - private R representation; - private List> neighbours; + private final R representation; + private final List> neighbours; + private int startTime; private int endTime; Modified: trunk/src/main/org/jboss/envers/tools/log/YLog.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/log/YLog.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/tools/log/YLog.java 2008-08-17 14:24:36 UTC (rev 113) @@ -31,10 +31,10 @@ * @author Adam Warski (adam at warski dot org) */ public class YLog { - private Object delegate; - private Method errorMethod; - private Method warnMethod; - private Method infoMethod; + private final Object delegate; + private final Method errorMethod; + private final Method warnMethod; + private final Method infoMethod; public YLog(Object delegate, Class argClass) { this.delegate = delegate; Modified: trunk/src/main/org/jboss/envers/tools/log/YLogManager.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/log/YLogManager.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/tools/log/YLogManager.java 2008-08-17 14:24:36 UTC (rev 113) @@ -37,10 +37,6 @@ private Class argClass; private YLogManager() { - initMethod(); - } - - private void initMethod() { ClassLoader cl = YLogManager.class.getClassLoader(); try { Modified: trunk/src/main/org/jboss/envers/tools/reflection/YClass.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/reflection/YClass.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/tools/reflection/YClass.java 2008-08-17 14:24:36 UTC (rev 113) @@ -32,8 +32,8 @@ * @author Adam Warski (adam at warski dot org) */ public class YClass { - private YMethodsAndClasses ymc; - private Object delegate; + private final YMethodsAndClasses ymc; + private final Object delegate; public YClass(YMethodsAndClasses ymc, Object delegate) { this.ymc = ymc; Modified: trunk/src/main/org/jboss/envers/tools/reflection/YMethodsAndClasses.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/reflection/YMethodsAndClasses.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/tools/reflection/YMethodsAndClasses.java 2008-08-17 14:24:36 UTC (rev 113) @@ -29,46 +29,23 @@ * @author Adam Warski (adam at warski dot org) */ public class YMethodsAndClasses { - private Method reflectionManager_classForNameMethod; - private Method reflectionManager_equalsMethod; + private final Method reflectionManager_classForNameMethod; + private final Method reflectionManager_equalsMethod; - private Method xClass_getNameMethod; - private Method xClass_getSuperclassMethod; - private Method xClass_getDeclaredPropertiesMethod; - private Method xClass_getAnnotationMethod; + private final Method xClass_getNameMethod; + private final Method xClass_getSuperclassMethod; + private final Method xClass_getDeclaredPropertiesMethod; + private final Method xClass_getAnnotationMethod; - private Method xProperty_getNameMethod; - private Method xProperty_getAnnotationMethod; - private Method xProperty_getTypeMethod; + private final Method xProperty_getNameMethod; + private final Method xProperty_getAnnotationMethod; + private final Method xProperty_getTypeMethod; - private Class reflectionManagerClass; - private Class xClassClass; - private Class xPropertyClass; - public YMethodsAndClasses(Class delegateClass) throws Exception { - initClasses(delegateClass); - initMethods(); - } - - private void initMethods() throws Exception { - reflectionManager_classForNameMethod = reflectionManagerClass.getMethod("classForName", String.class, Class.class); - reflectionManager_equalsMethod = reflectionManagerClass.getMethod("equals", xClassClass, Class.class); - - xClass_getNameMethod = xClassClass.getMethod("getName"); - xClass_getSuperclassMethod = xClassClass.getMethod("getSuperclass"); - xClass_getDeclaredPropertiesMethod = xClassClass.getMethod("getDeclaredProperties", String.class); - xClass_getAnnotationMethod = xClassClass.getMethod("getAnnotation", Class.class); - - xProperty_getNameMethod = xPropertyClass.getMethod("getName"); - xProperty_getTypeMethod = xPropertyClass.getMethod("getType"); - xProperty_getAnnotationMethod = xPropertyClass.getMethod("getAnnotation", Class.class); - } - - private void initClasses(Class delegateClass) { + // Initializing classes ClassLoader cl = YMethodsAndClasses.class.getClassLoader(); - reflectionManagerClass = delegateClass; - + Class xClassClass; try { xClassClass = cl.loadClass("org.hibernate.annotations.common.reflection.XClass"); } catch (ClassNotFoundException e) { @@ -79,6 +56,7 @@ } } + Class xPropertyClass; try { xPropertyClass = cl.loadClass("org.hibernate.annotations.common.reflection.XProperty"); } catch (ClassNotFoundException e) { @@ -88,6 +66,19 @@ throw new VersionsException("No XProperty found."); } } + + // Initializing methods + reflectionManager_classForNameMethod = delegateClass.getMethod("classForName", String.class, Class.class); + reflectionManager_equalsMethod = delegateClass.getMethod("equals", xClassClass, Class.class); + + xClass_getNameMethod = xClassClass.getMethod("getName"); + xClass_getSuperclassMethod = xClassClass.getMethod("getSuperclass"); + xClass_getDeclaredPropertiesMethod = xClassClass.getMethod("getDeclaredProperties", String.class); + xClass_getAnnotationMethod = xClassClass.getMethod("getAnnotation", Class.class); + + xProperty_getNameMethod = xPropertyClass.getMethod("getName"); + xProperty_getTypeMethod = xPropertyClass.getMethod("getType"); + xProperty_getAnnotationMethod = xPropertyClass.getMethod("getAnnotation", Class.class); } public Method getXClass_getNameMethod() { Modified: trunk/src/main/org/jboss/envers/tools/reflection/YProperty.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/reflection/YProperty.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/tools/reflection/YProperty.java 2008-08-17 14:24:36 UTC (rev 113) @@ -30,8 +30,8 @@ * @author Adam Warski (adam at warski dot org) */ public class YProperty { - private YMethodsAndClasses ymc; - private Object delegate; + private final YMethodsAndClasses ymc; + private final Object delegate; public YProperty(YMethodsAndClasses ymc, Object delegate) { this.ymc = ymc; Modified: trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java 2008-08-16 17:42:15 UTC (rev 112) +++ trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java 2008-08-17 14:24:36 UTC (rev 113) @@ -32,8 +32,8 @@ * @author Adam Warski (adam at warski dot org) */ public class YReflectionManager { - private Object delegate; - private YMethodsAndClasses ymc; + private final Object delegate; + private final YMethodsAndClasses ymc; public YReflectionManager(Configuration cfg) throws Exception { delegate = cfg.getClass().getMethod("getReflectionManager").invoke(cfg); From jboss-envers-commits at lists.jboss.org Mon Aug 18 03:44:39 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Mon, 18 Aug 2008 03:44:39 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r114 - in trunk/src/main/org/jboss/envers: configuration/metadata and 7 other directories. Message-ID: Author: adamw Date: 2008-08-18 03:44:39 -0400 (Mon, 18 Aug 2008) New Revision: 114 Added: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/configuration/metadata/EntityMappingData.java trunk/src/main/org/jboss/envers/entities/RelationType.java Removed: trunk/src/main/org/jboss/envers/reader/lazy/ Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java trunk/src/main/org/jboss/envers/entities/RelationDescription.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/query/criteria/CriteriaTools.java trunk/src/main/org/jboss/envers/query/criteria/IdentifierEqVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/NotNullVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/NullVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/RelatedVersionsExpression.java trunk/src/main/org/jboss/envers/query/criteria/SimpleVersionsExpression.java trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java Log: ENVERS-37: restructing metdata configuration Added: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-18 07:44:39 UTC (rev 114) @@ -0,0 +1,116 @@ +package org.jboss.envers.configuration; + +import org.jboss.envers.entities.EntitiesConfigurations; +import org.jboss.envers.configuration.metadata.VersionsMetadataGenerator; +import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; +import org.jboss.envers.configuration.metadata.AnnotationsMetadataReader; +import org.jboss.envers.configuration.metadata.EntityMappingData; +import org.jboss.envers.tools.graph.GraphTopologicalSort; +import org.jboss.envers.tools.reflection.YReflectionManager; +import org.dom4j.io.DOMWriter; +import org.dom4j.io.XMLWriter; +import org.dom4j.io.OutputFormat; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.MappingException; +import org.hibernate.cfg.Configuration; + +import java.util.Iterator; +import java.util.Map; +import java.util.HashMap; +import java.io.ByteArrayOutputStream; +import java.io.Writer; +import java.io.PrintWriter; +import java.io.IOException; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class EntitiesConfigurator { + public EntitiesConfigurations configure(Configuration cfg, YReflectionManager reflectionManager, + GlobalConfiguration globalCfg, VersionsEntitiesConfiguration verEntCfg, + Document revisionInfoXmlMapping) { + VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(globalCfg, verEntCfg); + DOMWriter writer = new DOMWriter(); + + // Sorting the persistent class topologically - superclass always before subclass + Iterator classes = GraphTopologicalSort.sort(new PersistentClassGraphDefiner(cfg)).iterator(); + + Map pcDatas = + new HashMap(); + Map xmlMappings = new HashMap(); + + // First pass + AnnotationsMetadataReader annotationsMetadataReader = new AnnotationsMetadataReader(); + while (classes.hasNext()) { + PersistentClass pc = classes.next(); + // Collecting information from annotations on the persistent class pc + PersistentClassVersioningData versioningData = + annotationsMetadataReader.getVersioningData(pc, reflectionManager); + + if (versioningData.isVersioned()) { + pcDatas.put(pc, versioningData); + + if (versioningData.versionsTableName != null) { + verEntCfg.addCustomVersionsTableName(pc.getEntityName(), versioningData.versionsTableName); + } + + EntityMappingData mappingData = new EntityMappingData(); + versionsMetaGen.generateFirstPass(pc, versioningData, mappingData); + xmlMappings.put(pc, mappingData); + } + } + + // Second pass + for (PersistentClass pc : pcDatas.keySet()) { + EntityMappingData mappingData = xmlMappings.get(pc); + + versionsMetaGen.generateSecondPass(pc, pcDatas.get(pc), mappingData); + + //TODO + //writeDocument(document); + + try { + cfg.addDocument(writer.write(mappingData.getMainMapping())); + + for (Document additionalMapping : mappingData.getAdditionalMappings()) { + cfg.addDocument(writer.write(additionalMapping)); + } + } catch (DocumentException e) { + throw new MappingException(e); + } + } + + // Only if there are any versioned classes + if (pcDatas.size() > 0) { + try { + if (revisionInfoXmlMapping != null) { + cfg.addDocument(writer.write(revisionInfoXmlMapping)); + } + } catch (DocumentException e) { + throw new MappingException(e); + } + } + + return new EntitiesConfigurations(versionsMetaGen.getEntitiesConfigurations()); + } + + // todo + private void writeDocument(Document e) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Writer w = new PrintWriter(baos); + + try { + XMLWriter xw = new XMLWriter(w, new OutputFormat(" ", true)); + xw.write(e); + w.flush(); + } catch (IOException e1) { + e1.printStackTrace(); + } + + System.out.println("-----------"); + System.out.println(baos.toString()); + System.out.println("-----------"); + } +} Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-18 07:44:39 UTC (rev 114) @@ -22,27 +22,12 @@ package org.jboss.envers.configuration; import org.hibernate.cfg.Configuration; -import org.hibernate.mapping.PersistentClass; -import org.hibernate.MappingException; -import org.jboss.envers.configuration.metadata.VersionsMetadataGenerator; -import org.jboss.envers.configuration.metadata.AnnotationsMetadataReader; -import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; import org.jboss.envers.entities.EntitiesConfigurations; import org.jboss.envers.synchronization.VersionsSyncManager; -import org.jboss.envers.tools.graph.GraphTopologicalSort; import org.jboss.envers.tools.reflection.YReflectionManager; import org.jboss.envers.revisioninfo.RevisionInfoQueryCreator; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.io.XMLWriter; -import org.dom4j.io.OutputFormat; -import org.dom4j.io.DOMWriter; import java.util.*; -import java.io.ByteArrayOutputStream; -import java.io.Writer; -import java.io.PrintWriter; -import java.io.IOException; /** * @author Adam Warski (adam at warski dot org) @@ -74,85 +59,19 @@ return revisionInfoQueryCreator; } - private YReflectionManager getReflectionManager(Configuration cfg) { - try { - return new YReflectionManager(cfg); - } catch (Exception e) { - throw new MappingException(e); - } - } - @SuppressWarnings({"unchecked"}) public VersionsConfiguration(Configuration cfg) { Properties properties = cfg.getProperties(); - YReflectionManager reflectionManager = getReflectionManager(cfg); + YReflectionManager reflectionManager = YReflectionManager.get(cfg); RevisionInfoConfiguration revInfoCfg = new RevisionInfoConfiguration(); RevisionInfoConfigurationResult revInfoCfgResult = revInfoCfg.configure(cfg, reflectionManager); verEntCfg = new VersionsEntitiesConfiguration(properties, revInfoCfgResult.getRevisionPropType()); globalCfg = new GlobalConfiguration(properties); versionsSyncManager = new VersionsSyncManager(revInfoCfgResult.getRevisionNumberGenerator()); revisionInfoQueryCreator = revInfoCfgResult.getRevisionInfoQueryCreator(); - - VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(this); - DOMWriter writer = new DOMWriter(); - - // Sorting the persistent class topologically - superclass always before subclass - Iterator classes = GraphTopologicalSort.sort(new PersistentClassGraphDefiner(cfg)).iterator(); - - Map pcDatas = - new HashMap(); - Map documents = new HashMap(); - - // First pass - AnnotationsMetadataReader annotationsMetadataReader = new AnnotationsMetadataReader(); - while (classes.hasNext()) { - PersistentClass pc = classes.next(); - // Collecting information from annotations on the persistent class pc - PersistentClassVersioningData versioningData = - annotationsMetadataReader.getVersioningData(pc, reflectionManager); - - if (versioningData.isVersioned()) { - pcDatas.put(pc, versioningData); - - if (versioningData.versionsTableName != null) { - verEntCfg.addCustomVersionsTableName(pc.getEntityName(), versioningData.versionsTableName); - } - - Document genData = versionsMetaGen.generateFirstPass(pc, versioningData); - documents.put(pc, genData); - } - } - - // Second pass - for (PersistentClass pc : pcDatas.keySet()) { - Document document = documents.get(pc); - - versionsMetaGen.generateSecondPass(pc, pcDatas.get(pc), document); - - //TODO - //writeDocument(document); - - try { - cfg.addDocument(writer.write(document)); - } catch (DocumentException e) { - throw new MappingException(e); - } - } - - // Getting the entities configurations - entCfg = new EntitiesConfigurations(versionsMetaGen.getEntitiesConfigurations()); - - // Only if there are any versioned classes - if (pcDatas.size() > 0) { - try { - if (revInfoCfgResult.getRevisionInfoXmlMapping() != null) { - cfg.addDocument(writer.write(revInfoCfgResult.getRevisionInfoXmlMapping())); - } - } catch (DocumentException e) { - throw new MappingException(e); - } - } + entCfg = new EntitiesConfigurator().configure(cfg, reflectionManager, globalCfg, verEntCfg, + revInfoCfgResult.getRevisionInfoXmlMapping()); } // @@ -172,22 +91,4 @@ return verCfg; } - - // todo - private void writeDocument(Document e) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - Writer w = new PrintWriter(baos); - - try { - XMLWriter xw = new XMLWriter(w, new OutputFormat(" ", true)); - xw.write(e); - w.flush(); - } catch (IOException e1) { - e1.printStackTrace(); - } - - System.out.println("-----------"); - System.out.println(baos.toString()); - System.out.println("-----------"); - } } Added: trunk/src/main/org/jboss/envers/configuration/metadata/EntityMappingData.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/EntityMappingData.java (rev 0) +++ trunk/src/main/org/jboss/envers/configuration/metadata/EntityMappingData.java 2008-08-18 07:44:39 UTC (rev 114) @@ -0,0 +1,35 @@ +package org.jboss.envers.configuration.metadata; + +import org.dom4j.Document; +import org.dom4j.DocumentHelper; + +import java.util.List; +import java.util.ArrayList; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class EntityMappingData { + private Document mainMapping; + private List additionalMappings; + + public EntityMappingData() { + mainMapping = DocumentHelper.createDocument(); + additionalMappings = new ArrayList(); + } + + public Document getMainMapping() { + return mainMapping; + } + + public List getAdditionalMappings() { + return additionalMappings; + } + + public Document newAdditionalMapping() { + Document additionalMapping = DocumentHelper.createDocument(); + additionalMappings.add(additionalMapping); + + return additionalMapping; + } +} Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-18 07:44:39 UTC (rev 114) @@ -26,13 +26,12 @@ import org.hibernate.util.StringHelper; import org.hibernate.MappingException; import org.dom4j.Element; -import org.dom4j.Document; -import org.dom4j.DocumentHelper; import org.dom4j.Attribute; import org.dom4j.tree.DefaultElement; import org.jboss.envers.entities.EntityConfiguration; import org.jboss.envers.entities.IdMappingData; -import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.configuration.GlobalConfiguration; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; import org.jboss.envers.entities.mapper.*; import org.jboss.envers.entities.mapper.id.*; import org.jboss.envers.entities.mapper.relation.ToOneIdMapper; @@ -44,8 +43,6 @@ import org.jboss.envers.ModificationStore; import org.jboss.envers.tools.log.YLog; import org.jboss.envers.tools.log.YLogManager; -import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; -import org.jboss.envers.configuration.metadata.PropertyStoreInfo; import org.jboss.envers.exception.VersionsException; import java.util.Iterator; @@ -59,7 +56,9 @@ public class VersionsMetadataGenerator { private final static Map EMPTY_STORE = Collections.emptyMap(); - private VersionsConfiguration verCfg; + private final GlobalConfiguration globalCfg; + private final VersionsEntitiesConfiguration verEntCfg; + private Map entitiesConfigurations; // Map entity name -> (join descriptor -> element describing the "versioned" join) @@ -67,8 +66,9 @@ private YLog log = YLogManager.getLogManager().getLog(VersionsMetadataGenerator.class); - public VersionsMetadataGenerator(VersionsConfiguration verCfg) { - this.verCfg = verCfg; + public VersionsMetadataGenerator(GlobalConfiguration globalCfg, VersionsEntitiesConfiguration verEntCfg) { + this.globalCfg = globalCfg; + this.verEntCfg = verEntCfg; entitiesConfigurations = new HashMap(); entitiesJoins = new HashMap>(); @@ -425,7 +425,7 @@ } else { String message = "Type not supported for versioning: " + propertyType.getClass().getName() + ", on entity " + entityName + ", property '" + property.getName() + "'."; - if (verCfg.getGlobalCfg().isWarnOnUnsupportedTypes()) { + if (globalCfg.isWarnOnUnsupportedTypes()) { log.warn(message); } else { throw new MappingException(message); @@ -451,7 +451,7 @@ String originalTableName = join.getTable().getName(); String versionedTableName = versioningData.secondaryTableDictionary.get(originalTableName); if (versionedTableName == null) { - versionedTableName = verCfg.getVerEntCfg().getVersionsEntityName(originalTableName); + versionedTableName = verEntCfg.getVersionsEntityName(originalTableName); } String schema = versioningData.schema; @@ -469,7 +469,7 @@ Element joinKey = joinElement.addElement("key"); addColumns(joinKey, join.getKey().getColumnIterator()); - MetadataTools.addColumn(joinKey, verCfg.getVerEntCfg().getRevisionPropName(), null); + MetadataTools.addColumn(joinKey, verEntCfg.getRevisionPropName(), null); } } @@ -521,12 +521,12 @@ addSimpleProperty(orig_id_mapping, id_prop, null, ModificationStore.FULL, true); } - orig_id_mapping.addAttribute("name", verCfg.getVerEntCfg().getOriginalIdPropName()); + orig_id_mapping.addAttribute("name", verEntCfg.getOriginalIdPropName()); // Adding the "revision number" property - Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verCfg.getVerEntCfg().getRevisionPropName(), - verCfg.getVerEntCfg().getRevisionPropType(), true); - MetadataTools.addColumn(rev_mapping, verCfg.getVerEntCfg().getRevisionPropName(), null); + Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verEntCfg.getRevisionPropName(), + verEntCfg.getRevisionPropType(), true); + MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); return new IdMappingData(mapper, orig_id_mapping, rel_id_mapping); } @@ -543,9 +543,8 @@ } @SuppressWarnings({"unchecked"}) - public Document generateFirstPass(PersistentClass pc, PersistentClassVersioningData versioningData) { - Document document = DocumentHelper.createDocument(); - + public void generateFirstPass(PersistentClass pc, PersistentClassVersioningData versioningData, + EntityMappingData mappingData) { String schema = versioningData.schema; if (StringTools.isEmpty(schema)) { schema = pc.getTable().getSchema(); @@ -557,8 +556,8 @@ } String entityName = pc.getEntityName(); - String versionsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(entityName); - String versionsTableName = verCfg.getVerEntCfg().getVersionsTableName(entityName, pc.getTable().getName()); + String versionsEntityName = verEntCfg.getVersionsEntityName(entityName); + String versionsTableName = verEntCfg.getVersionsTableName(entityName, pc.getTable().getName()); // Generating a mapping for the id IdMappingData idMapper = addId(pc); @@ -571,7 +570,7 @@ switch (inheritanceType) { case NONE: - class_mapping = MetadataTools.createEntity(document, versionsEntityName, versionsTableName, + class_mapping = MetadataTools.createEntity(mappingData.getMainMapping(), versionsEntityName, versionsTableName, schema, catalog, pc.getDiscriminatorValue()); propertyMapper = new MultiPropertyMapper(); @@ -589,15 +588,15 @@ class_mapping.add((Element) idMapper.getXmlMapping().clone()); // Adding the "revision type" property - Element revTypeProperty = MetadataTools.addProperty(class_mapping, verCfg.getVerEntCfg().getRevisionTypePropName(), - verCfg.getVerEntCfg().getRevisionTypePropType(), false); + Element revTypeProperty = MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionTypePropName(), + verEntCfg.getRevisionTypePropType(), false); revTypeProperty.addAttribute("type", "org.jboss.envers.entities.RevisionTypeType"); break; case SINGLE: - String extendsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(pc.getSuperclass().getEntityName()); - class_mapping = MetadataTools.createSubclassEntity(document, versionsEntityName, versionsTableName, - schema, catalog, extendsEntityName, pc.getDiscriminatorValue()); + String extendsEntityName = verEntCfg.getVersionsEntityName(pc.getSuperclass().getEntityName()); + class_mapping = MetadataTools.createSubclassEntity(mappingData.getMainMapping(), versionsEntityName, + versionsTableName, schema, catalog, extendsEntityName, pc.getDiscriminatorValue()); addPersisterHack(class_mapping); @@ -629,21 +628,19 @@ EntityConfiguration entityCfg = new EntityConfiguration(entityName, versionsEntityName, idMapper, propertyMapper, parentEntityName); entitiesConfigurations.put(pc.getEntityName(), entityCfg); - - return document; } @SuppressWarnings({"unchecked"}) public void generateSecondPass(PersistentClass pc, PersistentClassVersioningData versioningData, - Document document) { + EntityMappingData mappingData) { String entityName = pc.getEntityName(); CompositeMapperBuilder propertyMapper = entitiesConfigurations.get(entityName).getPropertyMapper(); // Mapping unjoined properties - Element parent = document.getRootElement().element("class"); + Element parent = mappingData.getMainMapping().getRootElement().element("class"); if (parent == null) { - parent = document.getRootElement().element("subclass"); + parent = mappingData.getMainMapping().getRootElement().element("subclass"); } addProperties(parent, (Iterator) pc.getUnjoinedPropertyIterator(), Modified: trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java 2008-08-18 07:44:39 UTC (rev 114) @@ -21,9 +21,6 @@ */ package org.jboss.envers.entities; -import org.jboss.envers.entities.mapper.id.IdMapper; -import org.jboss.envers.entities.mapper.ExtendedPropertyMapper; - import java.util.Map; import java.util.HashMap; @@ -61,12 +58,12 @@ for (RelationDescription relDesc : entCfg.getRelationsIterator()) { // If this is an "owned" relation, checking the related entity, if it has a relation that has // a mapped-by attribute to the currently checked. If so, this is a bidirectional relation. - if (relDesc.relationType == RelationDescription.RelationType.TO_ONE) { - for (RelationDescription other : entitiesConfigurations.get(relDesc.toEntityName).getRelationsIterator()) { - if (relDesc.fromPropertyName.equals(other.mappedByPropertyName) && - (entityName.equals(other.toEntityName))) { - relDesc.bidirectional = true; - other.bidirectional= true; + if (relDesc.getRelationType() == RelationType.TO_ONE) { + for (RelationDescription other : entitiesConfigurations.get(relDesc.getToEntityName()).getRelationsIterator()) { + if (relDesc.getFromPropertyName().equals(other.getMappedByPropertyName()) && + (entityName.equals(other.getToEntityName()))) { + relDesc.setBidirectional(true); + other.setBidirectional(true); } } } @@ -86,14 +83,6 @@ return get(entityName) != null; } - public IdMapper getIdMapper(String entityName) { - return get(entityName).getIdMappingData().getIdMapper(); - } - - public ExtendedPropertyMapper getPropertyMapper(String entityName) { - return get(entityName).getPropertyMapper(); - } - public RelationDescription getRelationDescription(String entityName, String propertyName) { EntityConfiguration entCfg = entitiesConfigurations.get(entityName); RelationDescription relDesc = entCfg.getRelationDescription(propertyName); Modified: trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-18 07:44:39 UTC (rev 114) @@ -21,7 +21,6 @@ */ package org.jboss.envers.entities; -import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.entities.mapper.ExtendedPropertyMapper; import org.jboss.envers.entities.mapper.id.IdMapper; @@ -52,30 +51,26 @@ } public void addToOneRelation(String fromPropertyName, String toEntityName, IdMapper idMapper) { - relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.TO_ONE, + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationType.TO_ONE, toEntityName, null, idMapper)); } public void addOneToOneRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, IdMapper idMapper) { - relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.ONE_TO_ONE, + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationType.ONE_TO_ONE, toEntityName, mappedByPropertyName, idMapper)); } public void addOneToManyRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, IdMapper idMapper) { - relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationDescription.RelationType.ONE_TO_MANY, + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationType.ONE_TO_MANY, toEntityName, mappedByPropertyName, idMapper)); } public boolean isRelation(String propertyName) { return relations.get(propertyName) != null; } - - public Iterable getRelationsIterator() { - return relations.values(); - } - + public RelationDescription getRelationDescription(String propertyName) { return relations.get(propertyName); } @@ -84,19 +79,29 @@ return idMappingData; } + public IdMapper getIdMapper() { + return idMappingData.getIdMapper(); + } + public ExtendedPropertyMapper getPropertyMapper() { return propertyMapper; } - public String getParentEntityName() { - return parentEntityName; - } - public String getEntityName() { return entityName; } - public String getVersionsEntityName() { + // For use by EntitiesConfigurations + + String getParentEntityName() { + return parentEntityName; + } + + String getVersionsEntityName() { return versionsEntityName; } + + Iterable getRelationsIterator() { + return relations.values(); + } } Modified: trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java 2008-08-18 07:44:39 UTC (rev 114) @@ -70,12 +70,13 @@ throw new VersionsException(e); } - IdMapper idMapper = verCfg.getEntCfg().getIdMapper(entityName); + IdMapper idMapper = verCfg.getEntCfg().get(entityName).getIdMapper(); Map originalId = (Map) versionsEntity.get(verCfg.getVerEntCfg().getOriginalIdPropName()); Object primaryKey = idMapper.mapToIdFromMap(originalId); - verCfg.getEntCfg().getPropertyMapper(entityName).mapToEntityFromMap(ret, versionsEntity, primaryKey, versionsReader, revision); + verCfg.getEntCfg().get(entityName).getPropertyMapper().mapToEntityFromMap(ret, versionsEntity, primaryKey, + versionsReader, revision); idMapper.mapToEntityFromMap(ret, originalId); return ret; Modified: trunk/src/main/org/jboss/envers/entities/RelationDescription.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/RelationDescription.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/entities/RelationDescription.java 2008-08-18 07:44:39 UTC (rev 114) @@ -27,12 +27,12 @@ * @author Adam Warski (adam at warski dot org) */ public class RelationDescription { - public final String fromPropertyName; - public final RelationType relationType; - public final String toEntityName; - public final String mappedByPropertyName; - public final IdMapper idMapper; - public boolean bidirectional; + private final String fromPropertyName; + private final RelationType relationType; + private final String toEntityName; + private final String mappedByPropertyName; + private final IdMapper idMapper; + private boolean bidirectional; public RelationDescription(String fromPropertyName, RelationType relationType, String toEntityName, String mappedByPropertyName, IdMapper idMapper) { @@ -45,9 +45,31 @@ this.bidirectional = false; } - public static enum RelationType { - TO_ONE, - ONE_TO_ONE, - ONE_TO_MANY + public String getFromPropertyName() { + return fromPropertyName; } + + public RelationType getRelationType() { + return relationType; + } + + public String getToEntityName() { + return toEntityName; + } + + public String getMappedByPropertyName() { + return mappedByPropertyName; + } + + public IdMapper getIdMapper() { + return idMapper; + } + + public boolean isBidirectional() { + return bidirectional; + } + + void setBidirectional(boolean bidirectional) { + this.bidirectional = bidirectional; + } } Added: trunk/src/main/org/jboss/envers/entities/RelationType.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/RelationType.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/RelationType.java 2008-08-18 07:44:39 UTC (rev 114) @@ -0,0 +1,10 @@ +package org.jboss.envers.entities; + +/** + * @author Adam Warski (adam at warski dot org) +*/ +public enum RelationType { + TO_ONE, + ONE_TO_ONE, + ONE_TO_MANY +} Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-18 07:44:39 UTC (rev 114) @@ -26,6 +26,7 @@ import org.hibernate.persister.entity.EntityPersister; import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.entities.RelationDescription; +import org.jboss.envers.entities.RelationType; import org.jboss.envers.synchronization.VersionsSync; import org.jboss.envers.synchronization.work.AddWorkUnit; import org.jboss.envers.synchronization.work.ModWorkUnit; @@ -58,24 +59,24 @@ for (int i=0; i originalId = new HashMap(); originalId.put(entitiesCfg.getRevisionPropName(), revision); - verCfg.getEntCfg().getIdMapper(getEntityName()).mapToMapFromId(originalId, id); + verCfg.getEntCfg().get(getEntityName()).getIdMapper().mapToMapFromId(originalId, id); data.put(entitiesCfg.getRevisionTypePropName(), revisionType); data.put(entitiesCfg.getOriginalIdPropName(), originalId); } Modified: trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-18 07:44:39 UTC (rev 114) @@ -53,7 +53,7 @@ Map data = new HashMap(); fillDataWithId(data, revision, RevisionType.ADD); - verCfg.getEntCfg().getPropertyMapper(getEntityName()).map(data, propertyNames, state, null); + verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().map(data, propertyNames, state, null); session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); Modified: trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-18 07:44:39 UTC (rev 114) @@ -49,7 +49,7 @@ Map data = new HashMap(); fillDataWithId(data, revision, RevisionType.MOD); - verCfg.getEntCfg().getPropertyMapper(getEntityName()).mapToMapFromEntity(data, entity, null); + verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().mapToMapFromEntity(data, entity, null); session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); Modified: trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-18 07:44:39 UTC (rev 114) @@ -42,7 +42,7 @@ super(entityName, verCfg, id); data = new HashMap(); - changes = verCfg.getEntCfg().getPropertyMapper(getEntityName()).map(data, entityPersister.getPropertyNames(), + changes = verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().map(data, entityPersister.getPropertyNames(), newState, oldState); } Modified: trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java 2008-08-17 14:24:36 UTC (rev 113) +++ trunk/src/main/org/jboss/envers/tools/reflection/YReflectionManager.java 2008-08-18 07:44:39 UTC (rev 114) @@ -22,6 +22,7 @@ package org.jboss.envers.tools.reflection; import org.hibernate.cfg.Configuration; +import org.hibernate.MappingException; import org.jboss.envers.exception.VersionsException; import java.lang.reflect.InvocationTargetException; @@ -59,4 +60,12 @@ throw new VersionsException(e); } } + + public static YReflectionManager get(Configuration cfg) { + try { + return new YReflectionManager(cfg); + } catch (Exception e) { + throw new MappingException(e); + } + } } From jboss-envers-commits at lists.jboss.org Wed Aug 20 07:44:45 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Wed, 20 Aug 2008 07:44:45 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r115 - in trunk: src/main/org/jboss/envers/configuration and 7 other directories. Message-ID: Author: adamw Date: 2008-08-20 07:44:45 -0400 (Wed, 20 Aug 2008) New Revision: 115 Added: trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java Modified: trunk/resources/test/hibernate.test.cfg.xml trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java trunk/src/test/org/jboss/envers/test/working/WorkingMain.java Log: ENVERS-26: storing changes in unidirectional one-to-many associations, set valued Modified: trunk/resources/test/hibernate.test.cfg.xml =================================================================== --- trunk/resources/test/hibernate.test.cfg.xml 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/resources/test/hibernate.test.cfg.xml 2008-08-20 11:44:45 UTC (rev 115) @@ -24,5 +24,14 @@ + + + + + + + + + \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-20 11:44:45 UTC (rev 115) @@ -68,14 +68,14 @@ versionsMetaGen.generateSecondPass(pc, pcDatas.get(pc), mappingData); - //TODO - //writeDocument(document); try { cfg.addDocument(writer.write(mappingData.getMainMapping())); + writeDocument(mappingData.getMainMapping()); for (Document additionalMapping : mappingData.getAdditionalMappings()) { - cfg.addDocument(writer.write(additionalMapping)); + cfg.addDocument(writer.write(additionalMapping)); + writeDocument(additionalMapping); } } catch (DocumentException e) { throw new MappingException(e); Modified: trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-08-20 11:44:45 UTC (rev 115) @@ -67,6 +67,7 @@ String tableName, String schema, String catalog, String discriminatorValue) { Element hibernate_mapping = document.addElement("hibernate-mapping"); + hibernate_mapping.addAttribute("auto-import", "false"); Element class_mapping = hibernate_mapping.addElement(type); class_mapping.addAttribute("entity-name", entityName); Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-20 11:44:45 UTC (rev 115) @@ -21,10 +21,11 @@ */ package org.jboss.envers.configuration.metadata; -import org.hibernate.mapping.*; import org.hibernate.type.*; import org.hibernate.util.StringHelper; import org.hibernate.MappingException; +import org.hibernate.mapping.*; +import org.hibernate.mapping.Collection; import org.dom4j.Element; import org.dom4j.Attribute; import org.dom4j.tree.DefaultElement; @@ -37,6 +38,7 @@ import org.jboss.envers.entities.mapper.relation.ToOneIdMapper; import org.jboss.envers.entities.mapper.relation.OneToOneIdMapper; import org.jboss.envers.entities.mapper.relation.OneToManyIdMapper; +import org.jboss.envers.entities.mapper.relation.OneToManyUnidirectionalMapper; import org.jboss.envers.tools.StringTools; import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.HibernateVersion; @@ -45,10 +47,9 @@ import org.jboss.envers.tools.log.YLogManager; import org.jboss.envers.exception.VersionsException; -import java.util.Iterator; +import java.util.*; +import java.util.List; import java.util.Map; -import java.util.Collections; -import java.util.HashMap; /** * @author Adam Warski (adam at warski dot org) @@ -87,6 +88,18 @@ } } + private void addRevisionNumber(Element any_mapping) { + Element rev_mapping = MetadataTools.addProperty(any_mapping, verEntCfg.getRevisionPropName(), + verEntCfg.getRevisionPropType(), true); + MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); + } + + private void addRevisionType(Element any_mapping) { + Element revTypeProperty = MetadataTools.addProperty(any_mapping, verEntCfg.getRevisionTypePropName(), + verEntCfg.getRevisionTypePropType(), false); + revTypeProperty.addAttribute("type", "org.jboss.envers.entities.RevisionTypeType"); + } + @SuppressWarnings({"unchecked"}) private void addSimpleProperty(Element parent, Property property, SimpleMapperBuilder mapper, ModificationStore store, boolean key) { @@ -126,7 +139,7 @@ @SuppressWarnings({"unchecked"}) private void addComponent(Element parent, Property property, CompositeMapperBuilder mapper, ModificationStore store, - String entityName, boolean firstPass) { + String entityName, EntityMappingData mappingData, boolean firstPass) { Element component_mapping = null; Component prop_component = (Component) property.getValue(); @@ -153,7 +166,7 @@ addProperties(component_mapping, (Iterator) prop_component.getPropertyIterator(), mapper.addComposite(property.getName()), new PropertyStoreInfo(store, EMPTY_STORE), entityName, - firstPass); + mappingData, firstPass); } @SuppressWarnings({"unchecked"}) @@ -172,7 +185,8 @@ } @SuppressWarnings({"unchecked"}) - private void prefixNamesInPropertyElement(Element element, String prefix, Iterator columnIterator) { + private void prefixNamesInPropertyElement(Element element, String prefix, Iterator columnIterator, + boolean changeToKey) { Iterator properties = element.elementIterator(); while (properties.hasNext()) { Element property = properties.next(); @@ -184,6 +198,10 @@ } changeNamesInColumnElement(property, columnIterator); + + if (changeToKey) { + property.setName("key-property"); + } } } } @@ -212,7 +230,7 @@ Element properties = (Element) idMapping.getXmlRelationMapping().clone(); properties.addAttribute("name", propertyName); - prefixNamesInPropertyElement(properties, lastPropertyPrefix, property.getValue().getColumnIterator()); + prefixNamesInPropertyElement(properties, lastPropertyPrefix, property.getValue().getColumnIterator(), false); parent.add(properties); // Adding mapper for the id @@ -302,7 +320,8 @@ } @SuppressWarnings({"unchecked"}) - private void addOneToManyUnidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { + private void addOneToManyUnidirectional(Property property, CompositeMapperBuilder mapper, String entityName, + EntityMappingData mappingData) { Collection propertyValue = (Collection) property.getValue(); ManyToOne mto = (ManyToOne) propertyValue.getElement(); @@ -321,12 +340,45 @@ IdMappingData referencingIdMapping = configuration.getIdMappingData(); IdMappingData referencedIdMapping = referencedConfiguration.getIdMappingData(); + String referencingPrefix = entityName + "_"; + String referencedPrefix = property.getName() + "_"; + // Name of the entity that will be used to store the relation between the two entities. - String middleEntityName = entityName + "_" + referencedEntityName; + String middleEntityName = referencingPrefix + referencedEntityName; + String versionsMiddleEntityName = verEntCfg.getVersionsEntityName(middleEntityName); + String versionsMiddleTableName = verEntCfg.getVersionsTableName(middleEntityName, mto.getTable().getName()); - MetadataTools.createEntity(null, middleEntityName, mto.getTable().getName(), mto.getTable().getSchema(), - mto.getTable().getCatalog(), null); + Element middleEntity = MetadataTools.createEntity(mappingData.newAdditionalMapping(), versionsMiddleEntityName, + versionsMiddleTableName, mto.getTable().getSchema(), mto.getTable().getCatalog(), null); + Element middleEntityId = middleEntity.addElement("composite-id"); + middleEntityId.addAttribute("name", verEntCfg.getOriginalIdPropName()); + + Iterator columnIterator = mto.getTable().getColumnIterator(); + + // Adding elements to the mapping corresponding to the referencing entity id's + Element properties = (Element) referencingIdMapping.getXmlRelationMapping().clone(); + prefixNamesInPropertyElement(properties, referencingPrefix, columnIterator, true); + for (Element idProperty : (List) properties.elements()) { + middleEntityId.add((Element) idProperty.clone()); + } + + // Adding elements to the mapping corresponding to the referenced entity id's + properties = (Element) referencedIdMapping.getXmlRelationMapping().clone(); + prefixNamesInPropertyElement(properties, referencedPrefix, columnIterator, true); + for (Element idProperty : (List) properties.elements()) { + middleEntityId.add((Element) idProperty.clone()); + } + + addRevisionNumber(middleEntityId); + addRevisionType(middleEntity); + + // Adding the property mapper + mapper.addComposite(property.getName(), new OneToManyUnidirectionalMapper(verEntCfg, property.getName(), + referencedEntityName, versionsMiddleEntityName, + referencingIdMapping.getIdMapper().prefixMappedProperties(referencingPrefix), + referencedIdMapping.getIdMapper().prefixMappedProperties(referencedPrefix))); + // TODO: ??? } @@ -363,7 +415,8 @@ @SuppressWarnings({"unchecked"}) private void addProperties(Element parent, Iterator properties, CompositeMapperBuilder currentMapper, - PropertyStoreInfo propertyStoreInfo, String entityName, boolean firstPass) { + PropertyStoreInfo propertyStoreInfo, String entityName, EntityMappingData mappingData, + boolean firstPass) { while (properties.hasNext()) { Property property = properties.next(); Type propertyType = property.getType(); @@ -374,7 +427,7 @@ if (propertyType instanceof ComponentType) { // only first pass if (firstPass) { - addComponent(parent, property, currentMapper, store, entityName, firstPass); + addComponent(parent, property, currentMapper, store, entityName, mappingData, firstPass); } } else if (propertyType instanceof ImmutableType || propertyType instanceof MutableType) { // only first pass @@ -420,7 +473,7 @@ ((((Collection) property.getValue()).getElement() instanceof ManyToOne))) { // only second pass if (!firstPass) { - addOneToManyUnidirectional(property, currentMapper, entityName); + addOneToManyUnidirectional(property, currentMapper, entityName, mappingData); } } else { String message = "Type not supported for versioning: " + propertyType.getClass().getName() + @@ -475,7 +528,7 @@ @SuppressWarnings({"unchecked"}) private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PropertyStoreInfo propertyStoreInfo, - String entityName, boolean firstPass) { + String entityName, EntityMappingData mappingData, boolean firstPass) { Iterator joins = pc.getJoinIterator(); while (joins.hasNext()) { @@ -483,7 +536,7 @@ Element joinElement = entitiesJoins.get(entityName).get(join); addProperties(joinElement, join.getPropertyIterator(), currentMapper, propertyStoreInfo, entityName, - firstPass); + mappingData, firstPass); } } @@ -524,9 +577,7 @@ orig_id_mapping.addAttribute("name", verEntCfg.getOriginalIdPropName()); // Adding the "revision number" property - Element rev_mapping = MetadataTools.addProperty(orig_id_mapping, verEntCfg.getRevisionPropName(), - verEntCfg.getRevisionPropType(), true); - MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); + addRevisionNumber(orig_id_mapping); return new IdMappingData(mapper, orig_id_mapping, rel_id_mapping); } @@ -544,7 +595,7 @@ @SuppressWarnings({"unchecked"}) public void generateFirstPass(PersistentClass pc, PersistentClassVersioningData versioningData, - EntityMappingData mappingData) { + EntityMappingData mappingData) { String schema = versioningData.schema; if (StringTools.isEmpty(schema)) { schema = pc.getTable().getSchema(); @@ -588,9 +639,7 @@ class_mapping.add((Element) idMapper.getXmlMapping().clone()); // Adding the "revision type" property - Element revTypeProperty = MetadataTools.addProperty(class_mapping, verEntCfg.getRevisionTypePropName(), - verEntCfg.getRevisionTypePropType(), false); - revTypeProperty.addAttribute("type", "org.jboss.envers.entities.RevisionTypeType"); + addRevisionType(class_mapping); break; case SINGLE: @@ -618,14 +667,14 @@ // Mapping unjoined properties addProperties(class_mapping, (Iterator) pc.getUnjoinedPropertyIterator(), propertyMapper, - versioningData.propertyStoreInfo, pc.getEntityName(), true); + versioningData.propertyStoreInfo, pc.getEntityName(), mappingData, true); // Creating and mapping joins (first pass) createJoins(pc, class_mapping, versioningData); - addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, pc.getEntityName(), true); + addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, pc.getEntityName(), mappingData, true); // Storing the generated configuration - EntityConfiguration entityCfg = new EntityConfiguration(entityName, versionsEntityName, idMapper, + EntityConfiguration entityCfg = new EntityConfiguration(entityName, versionsEntityName, idMapper, propertyMapper, parentEntityName); entitiesConfigurations.put(pc.getEntityName(), entityCfg); } @@ -642,12 +691,12 @@ if (parent == null) { parent = mappingData.getMainMapping().getRootElement().element("subclass"); } - + addProperties(parent, (Iterator) pc.getUnjoinedPropertyIterator(), - propertyMapper, versioningData.propertyStoreInfo, entityName, false); + propertyMapper, versioningData.propertyStoreInfo, entityName, mappingData, false); // Mapping joins (second pass) - addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName, false); + addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName, mappingData, false); } public Map getEntitiesConfigurations() { Modified: trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -28,9 +28,12 @@ import org.hibernate.property.Getter; import org.hibernate.property.Setter; import org.hibernate.util.ReflectHelper; +import org.hibernate.collection.PersistentCollection; import java.util.Map; import java.util.HashMap; +import java.util.List; +import java.io.Serializable; /** * @author Adam Warski (adam at warski dot org) @@ -80,4 +83,11 @@ } } + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + return delegate.mapCollectionChangesFromCollections(referencingPropertyName, newColl, oldColl, id); + } + } Modified: trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -23,12 +23,15 @@ import org.hibernate.property.Getter; import org.hibernate.MappingException; +import org.hibernate.collection.PersistentCollection; import org.jboss.envers.ModificationStore; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import java.util.Map; import java.util.HashMap; +import java.util.List; +import java.io.Serializable; /** * @author Adam Warski (adam at warski dot org) @@ -104,4 +107,15 @@ } } + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + PropertyMapper mapper = properties.get(referencingPropertyName); + if (mapper != null) { + return mapper.mapCollectionChangesFromCollections(referencingPropertyName, newColl, oldColl, id); + } else { + return null; + } + } } Added: trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java 2008-08-20 11:44:45 UTC (rev 115) @@ -0,0 +1,24 @@ +package org.jboss.envers.entities.mapper; + +import java.util.Map; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class PersistentCollectionChangeData { + private String entityName; + private Map data; + + public PersistentCollectionChangeData(String entityName, Map data) { + this.entityName = entityName; + this.data = data; + } + + public String getEntityName() { + return entityName; + } + + public Map getData() { + return data; + } +} Modified: trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -22,8 +22,11 @@ package org.jboss.envers.entities.mapper; import org.jboss.envers.reader.VersionsReaderImplementor; +import org.hibernate.collection.PersistentCollection; import java.util.Map; +import java.util.List; +import java.io.Serializable; /** * @author Adam Warski (adam at warski dot org) @@ -49,4 +52,17 @@ */ public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision); + + /** + * Maps collection changes + * @param referencingPropertyName Name of the field, which holds the collection in the entity. + * @param newColl New collection, after updates. + * @param oldColl Old collection, before updates. + * @param id Id of the object owning the collection. + * @return List of changes that need to be performed on the persistent store. + */ + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id); } Modified: trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -27,8 +27,11 @@ import org.jboss.envers.tools.Tools; import org.jboss.envers.exception.VersionsException; import org.hibernate.property.Setter; +import org.hibernate.collection.PersistentCollection; import java.util.Map; +import java.util.List; +import java.io.Serializable; /** * TODO: diff @@ -66,4 +69,11 @@ setter.set(obj, data.get(propertyName), null); } + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + return null; + } + } Modified: trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -23,8 +23,11 @@ import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.ModificationStore; +import org.hibernate.collection.PersistentCollection; import java.util.Map; +import java.util.List; +import java.io.Serializable; /** * A mapper which maps from a parent mapper and a "main" one, but adds only to the "main". The "main" mapper @@ -59,6 +62,20 @@ main.mapToEntityFromMap(obj, data, primaryKey, versionsReader, revision); } + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + List collectionChanges = parentMapper.mapCollectionChangesFromCollections( + referencingPropertyName, newColl, oldColl, id); + + if (collectionChanges == null) { + return main.mapCollectionChangesFromCollections(referencingPropertyName, newColl, oldColl, id); + } else { + return collectionChanges; + } + } + public CompositeMapperBuilder addComposite(String propertyName) { return main.addComposite(propertyName); } Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -22,6 +22,7 @@ package org.jboss.envers.entities.mapper.relation; import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.entities.mapper.relation.lazy.OneToManyInitializor; import org.jboss.envers.entities.mapper.relation.lazy.proxy.ListProxy; @@ -30,8 +31,10 @@ import org.jboss.envers.tools.reflection.ReflectionTools; import org.hibernate.property.Setter; import org.hibernate.property.Getter; +import org.hibernate.collection.PersistentCollection; import java.util.*; +import java.io.Serializable; /** * @author Adam Warski (adam at warski dot org) @@ -77,4 +80,11 @@ Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); setter.set(obj, value, null); } + + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + return null; + } } \ No newline at end of file Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -0,0 +1,99 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.RevisionType; +import org.hibernate.collection.PersistentCollection; + +import java.util.*; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyUnidirectionalMapper implements PropertyMapper { + private final VersionsEntitiesConfiguration verEntCfg; + private final String collectionReferencingPropertyName; + private final String referencedEntityName; + private final String versionsMiddleEntityName; + private final IdMapper referencingMiddleIdMapper; + private final IdMapper referencedMiddleIdMapper; + + public OneToManyUnidirectionalMapper(VersionsEntitiesConfiguration verEntCfg, + String collectionReferencingPropertyName, + String referencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper) { + this.verEntCfg = verEntCfg; + this.collectionReferencingPropertyName = collectionReferencingPropertyName; + this.referencedEntityName = referencedEntityName; + this.versionsMiddleEntityName = versionsMiddleEntityName; + this.referencingMiddleIdMapper = referencingMiddleIdMapper; + this.referencedMiddleIdMapper = referencedMiddleIdMapper; + } + + private Collection getOldCollection(Serializable oldColl) { + if (oldColl instanceof Map) { + return ((Map) oldColl).keySet(); + } else { + return (Collection) oldColl; + } + } + + private void addCollectionChanges(List collectionChanges, Set changed, + RevisionType revisionType, Serializable id) { + for (Object changedEntity : changed) { + Map entityData = new HashMap(); + Map originalId = new HashMap(); + entityData.put(verEntCfg.getOriginalIdPropName(), originalId); + + collectionChanges.add(new PersistentCollectionChangeData(versionsMiddleEntityName, entityData)); + referencingMiddleIdMapper.mapToMapFromId(originalId, id); + referencedMiddleIdMapper.mapToMapFromEntity(originalId, changedEntity); + + entityData.put(verEntCfg.getRevisionTypePropName(), revisionType); + + System.out.println("entityData = " + entityData); + } + } + + @SuppressWarnings({"unchecked"}) + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + if (!collectionReferencingPropertyName.equals(referencingPropertyName)) { + return null; + } + + List collectionChanges = new ArrayList(); + + Collection newCollection = (Collection) newColl; + Collection oldCollection = getOldCollection(oldColl); + + Set added = new HashSet(); + if (newColl != null) { added.addAll(newCollection); } + if (oldColl != null) { added.removeAll(oldCollection); } + + addCollectionChanges(collectionChanges, added, RevisionType.ADD, id); + + Set deleted = new HashSet(); + if (oldColl != null) { deleted.addAll(oldCollection); } + if (newColl != null) { deleted.removeAll(newCollection); } + + addCollectionChanges(collectionChanges, deleted, RevisionType.DEL, id); + + return collectionChanges; + } + + @SuppressWarnings({"unchecked"}) + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + return false; + } + + public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + System.out.println("XXX"); + } +} Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -22,15 +22,19 @@ package org.jboss.envers.entities.mapper.relation; import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.query.VersionsRestrictions; import org.jboss.envers.exception.VersionsException; import org.hibernate.property.Setter; import org.hibernate.NonUniqueResultException; +import org.hibernate.collection.PersistentCollection; import javax.persistence.NoResultException; import java.util.Map; +import java.util.List; +import java.io.Serializable; /** * @author Adam Warski (adam at warski dot org) @@ -72,4 +76,11 @@ Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); setter.set(obj, value, null); } + + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + return null; + } } Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java 2008-08-20 11:44:45 UTC (rev 115) @@ -22,15 +22,19 @@ package org.jboss.envers.entities.mapper.relation; import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; import org.jboss.envers.entities.mapper.id.IdMapper; import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.entities.mapper.relation.lazy.ToOneDelegateSessionImplementor; import org.hibernate.property.Setter; +import org.hibernate.collection.PersistentCollection; import java.util.Map; import java.util.HashMap; +import java.util.List; +import java.io.Serializable; /** * @author Adam Warski (adam at warski dot org) @@ -62,10 +66,6 @@ } Object entityId = delegate.mapToIdFromMap((Map) data.get(propertyName)); - doMap(obj, versionsReader, revision, entityId); - } - - private void doMap(Object obj, VersionsReaderImplementor versionsReader, Number revision, Object entityId) { Object value; if (entityId == null) { value = null; @@ -79,4 +79,11 @@ Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); setter.set(obj, value, null); } + + public List mapCollectionChangesFromCollections(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + return null; + } } Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-20 11:44:45 UTC (rev 115) @@ -24,14 +24,13 @@ import org.hibernate.event.*; import org.hibernate.cfg.Configuration; import org.hibernate.persister.entity.EntityPersister; +import org.hibernate.engine.CollectionEntry; +import org.hibernate.collection.PersistentCollection; import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.entities.RelationDescription; import org.jboss.envers.entities.RelationType; import org.jboss.envers.synchronization.VersionsSync; -import org.jboss.envers.synchronization.work.AddWorkUnit; -import org.jboss.envers.synchronization.work.ModWorkUnit; -import org.jboss.envers.synchronization.work.DelWorkUnit; -import org.jboss.envers.synchronization.work.CollectionChangeWorkUnit; +import org.jboss.envers.synchronization.work.*; import org.jboss.envers.tools.Tools; import org.jboss.envers.entities.mapper.id.IdMapper; @@ -41,7 +40,8 @@ * @author Adam Warski (adam at warski dot org) */ public class VersionsEventListener implements PostInsertEventListener, PostUpdateEventListener, - PostDeleteEventListener, Initializable { + PostDeleteEventListener, PreCollectionUpdateEventListener, PreCollectionRemoveEventListener, + PostCollectionRecreateEventListener, Initializable { private VersionsConfiguration verCfg; private void generateCollectionChangeWorkUnits(VersionsSync verSync, EntityPersister entityPersister, @@ -71,12 +71,12 @@ // (size increases). if (newValue != null) { Serializable id = (Serializable) idMapper.mapToIdFromEntity(newValue); - verSync.addWorkUnit(new CollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, newValue)); + verSync.addWorkUnit(new BidirectionalCollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, newValue)); } if (oldValue != null) { Serializable id = (Serializable) idMapper.mapToIdFromEntity(oldValue); - verSync.addWorkUnit(new CollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, oldValue)); + verSync.addWorkUnit(new BidirectionalCollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, oldValue)); } } } @@ -121,6 +121,36 @@ } } + private void onCollectionAction(AbstractCollectionEvent event, PersistentCollection newColl, Serializable oldColl, + CollectionEntry collectionEntry) { + String entityName = event.getAffectedOwnerEntityName(); + + if (verCfg.getEntCfg().isVersioned(entityName)) { + VersionsSync verSync = verCfg.getSyncManager().get(event.getSession()); + + verSync.addWorkUnit(new PersistentCollectionChangeWorkUnit(entityName, verCfg, newColl, + collectionEntry.getRole(), oldColl, event.getAffectedOwnerIdOrNull())); + } + } + + private CollectionEntry getCollectionEntry(AbstractCollectionEvent event) { + return event.getSession().getPersistenceContext().getCollectionEntry(event.getCollection()); + } + + public void onPreUpdateCollection(PreCollectionUpdateEvent event) { + CollectionEntry collectionEntry = getCollectionEntry(event); + onCollectionAction(event, event.getCollection(), collectionEntry.getSnapshot(), collectionEntry); + } + + public void onPreRemoveCollection(PreCollectionRemoveEvent event) { + CollectionEntry collectionEntry = getCollectionEntry(event); + onCollectionAction(event, null, collectionEntry.getSnapshot(), collectionEntry); + } + + public void onPostRecreateCollection(PostCollectionRecreateEvent event) { + onCollectionAction(event, event.getCollection(), null, getCollectionEntry(event)); + } + @SuppressWarnings({"unchecked"}) public void initialize(Configuration cfg) { verCfg = VersionsConfiguration.getFor(cfg); Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-20 11:44:45 UTC (rev 115) @@ -38,7 +38,7 @@ private final RevisionNumberGenerator revisionNumberGenerator; private final VersionsSyncManager manager; private final Session session; - + private final Transaction transaction; private final LinkedList workUnits; private final Queue undoQueue; @@ -56,7 +56,7 @@ undoQueue = new LinkedList(); usedIds = new HashMap, VersionsWorkUnit>(); } - + private void removeWorkUnit(VersionsWorkUnit vwu) { workUnits.remove(vwu); if (vwu.isPerformed()) { @@ -68,30 +68,37 @@ public void addWorkUnit(VersionsWorkUnit vwu) { if (vwu.containsWork()) { Object entityId = vwu.getEntityId(); - String entityName = vwu.getEntityName(); - Pair usedIdsKey = Pair.make(entityName, entityId); - if (usedIds.containsKey(usedIdsKey)) { - VersionsWorkUnit other = usedIds.get(usedIdsKey); + if (entityId == null) { + // Just adding the work unit - it's not associated with any persistent entity. + workUnits.offer(vwu); + } else { + String entityName = vwu.getEntityName(); + Pair usedIdsKey = Pair.make(entityName, entityId); - // The entity with entityId has two work units; checking which one should be kept. - switch (vwu.dispatch(other)) { - case FIRST: - // Simply not adding the second - break; + if (usedIds.containsKey(usedIdsKey)) { + VersionsWorkUnit other = usedIds.get(usedIdsKey); - case SECOND: - removeWorkUnit(other); - usedIds.put(usedIdsKey, vwu); - workUnits.offer(vwu); - break; + // The entity with entityId has two work units; checking which one should be kept. + switch (vwu.dispatch(other)) { + case FIRST: + // Simply not adding the second + break; - case NONE: - removeWorkUnit(other); + case SECOND: + removeWorkUnit(other); + usedIds.put(usedIdsKey, vwu); + workUnits.offer(vwu); + break; + + case NONE: + removeWorkUnit(other); + break; + } + } else { + usedIds.put(usedIdsKey, vwu); + workUnits.offer(vwu); } - } else { - usedIds.put(usedIdsKey, vwu); - workUnits.offer(vwu); } } } Modified: trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-20 11:44:45 UTC (rev 115) @@ -72,7 +72,7 @@ return KeepCheckResult.NONE; } - public KeepCheckResult check(CollectionChangeWorkUnit second) { + public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { return KeepCheckResult.FIRST; } Copied: trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java (from rev 114, trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java) =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java (rev 0) +++ trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java 2008-08-20 11:44:45 UTC (rev 115) @@ -0,0 +1,78 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.synchronization.work; + +import org.hibernate.Session; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.RevisionType; + +import java.io.Serializable; +import java.util.Map; +import java.util.HashMap; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BidirectionalCollectionChangeWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { + private final Object entity; + + public BidirectionalCollectionChangeWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id, Object entity) { + super(entityName, verCfg, id); + + this.entity = entity; + } + + public boolean containsWork() { + return true; + } + + public void perform(Session session, Number revision) { + Map data = new HashMap(); + fillDataWithId(data, revision, RevisionType.MOD); + + verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().mapToMapFromEntity(data, entity, null); + + session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); + + setPerformed(data); + } + + public KeepCheckResult check(AddWorkUnit second) { + return KeepCheckResult.SECOND; + } + + public KeepCheckResult check(ModWorkUnit second) { + return KeepCheckResult.SECOND; + } + + public KeepCheckResult check(DelWorkUnit second) { + return KeepCheckResult.SECOND; + } + + public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { + return KeepCheckResult.FIRST; + } + + public KeepCheckResult dispatch(KeepCheckVisitor first) { + return first.check(this); + } +} Modified: trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-20 11:44:45 UTC (rev 115) @@ -62,7 +62,7 @@ return KeepCheckResult.FIRST; } - public KeepCheckResult check(CollectionChangeWorkUnit second) { + public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { return KeepCheckResult.FIRST; } Modified: trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java 2008-08-20 11:44:45 UTC (rev 115) @@ -29,5 +29,5 @@ KeepCheckResult check(AddWorkUnit second); KeepCheckResult check(ModWorkUnit second); KeepCheckResult check(DelWorkUnit second); - KeepCheckResult check(CollectionChangeWorkUnit second); + KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second); } Modified: trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-20 11:44:45 UTC (rev 115) @@ -70,7 +70,7 @@ return KeepCheckResult.SECOND; } - public KeepCheckResult check(CollectionChangeWorkUnit second) { + public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { return KeepCheckResult.FIRST; } Added: trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java (rev 0) +++ trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-20 11:44:45 UTC (rev 115) @@ -0,0 +1,66 @@ +package org.jboss.envers.synchronization.work; + +import org.hibernate.Session; +import org.hibernate.collection.PersistentCollection; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class PersistentCollectionChangeWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { + private final List collectionChanges; + + public PersistentCollectionChangeWorkUnit(String entityName, VersionsConfiguration verCfg, + PersistentCollection collection, String role, + Serializable snapshot, Serializable id) { + super(entityName, verCfg, null); + + String referencingPropertyName = role.substring(entityName.length() + 1); + + collectionChanges = verCfg.getEntCfg().get(getEntityName()).getPropertyMapper() + .mapCollectionChangesFromCollections(referencingPropertyName, collection, snapshot, id); + } + + public boolean containsWork() { + return collectionChanges == null || collectionChanges.size() != 0; + } + + @SuppressWarnings({"unchecked"}) + public void perform(Session session, Number revision) { + VersionsEntitiesConfiguration entitiesCfg = verCfg.getVerEntCfg(); + + for (PersistentCollectionChangeData persistentCollectionChangeData : collectionChanges) { + // Setting the revision number + ((Map) persistentCollectionChangeData.getData().get(entitiesCfg.getOriginalIdPropName())) + .put(entitiesCfg.getRevisionPropName(), revision); + + session.save(persistentCollectionChangeData.getEntityName(), persistentCollectionChangeData.getData()); + } + } + + public KeepCheckResult check(AddWorkUnit second) { + return null; + } + + public KeepCheckResult check(ModWorkUnit second) { + return null; + } + + public KeepCheckResult check(DelWorkUnit second) { + return null; + } + + public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { + return null; + } + + public KeepCheckResult dispatch(KeepCheckVisitor first) { + return null; + } +} Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-20 11:44:45 UTC (rev 115) @@ -25,10 +25,10 @@ //@Column(table = "second_table", name = "cc_second") private String cc; - @Versioned + //@Versioned //@OneToOne - @ManyToOne - //@Transient + //@ManyToOne + @Transient private WorkingEntity2 we2; public WorkingEntity1() { Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-20 11:44:45 UTC (rev 115) @@ -22,7 +22,7 @@ private String str2; @Versioned - @OneToMany(mappedBy="we2") + @OneToMany //(mappedBy="we2") //@ManyToMany //@Transient private Set we1s; Modified: trunk/src/test/org/jboss/envers/test/working/WorkingMain.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-18 07:44:39 UTC (rev 114) +++ trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-20 11:44:45 UTC (rev 115) @@ -60,43 +60,64 @@ // Rev 1 entityManager.getTransaction().begin(); - WorkingEntity2 we2 = new WorkingEntity2("s"); - entityManager.persist(we2); - WorkingEntity1 we1 = new WorkingEntity1("b", "c"); - we1.setWe2(we2); entityManager.persist(we1); WorkingEntity1 we1_2 = new WorkingEntity1("b2", "c2"); - we1_2.setWe2(we2); entityManager.persist(we1_2); + WorkingEntity1 we1_3 = new WorkingEntity1("b3", "c3"); + entityManager.persist(we1_3); + + WorkingEntity2 we2 = new WorkingEntity2("s"); + Set we1s = new HashSet(); + we1s.add(we1_3); + we2.setWe1s(we1s); + entityManager.persist(we2); + entityManager.getTransaction().commit(); // Rev 2 entityManager.getTransaction().begin(); we1 = entityManager.find(WorkingEntity1.class, we1.getId1()); - entityManager.remove(we1); + we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); + we2.getWe1s().add(we1); entityManager.getTransaction().commit(); // Rev 3 entityManager.getTransaction().begin(); - VersionsReader vr = VersionsReaderFactory.get(entityManager); + we1_2 = entityManager.find(WorkingEntity1.class, we1_2.getId1()); + we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); + we2.getWe1s().add(we1_2); - System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 1) - .getResultList()); - System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 1) - .setProjection(Projections.count("originalId.id1")).getResultList()); + entityManager.getTransaction().commit(); - System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 2) - .getResultList()); - System.out.println(vr.createQuery().forEntitiesAtRevision(WorkingEntity1.class, 2) - .setProjection(Projections.count("originalId.id1")).getResultList()); + // Rev 4 + entityManager.getTransaction().begin(); + we1_2 = entityManager.find(WorkingEntity1.class, we1_2.getId1()); + we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); + we2.getWe1s().remove(we1_2); + entityManager.getTransaction().commit(); + + // Rev 5 + entityManager.getTransaction().begin(); + + we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); + we2.setWe1s(null); + + entityManager.getTransaction().commit(); + + // Rev 6 + entityManager.getTransaction().begin(); + + VersionsReader vr = VersionsReaderFactory.get(entityManager); + + entityManager.getTransaction().commit(); } } From jboss-envers-commits at lists.jboss.org Thu Aug 21 06:19:09 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 21 Aug 2008 06:19:09 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r116 - in trunk/src: main/org/jboss/envers/entities and 10 other directories. Message-ID: Author: adamw Date: 2008-08-21 06:19:09 -0400 (Thu, 21 Aug 2008) New Revision: 116 Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/AbstractOneToManyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java Removed: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java trunk/src/main/org/jboss/envers/tools/StringTools.java trunk/src/test/org/jboss/envers/test/working/WorkingMain.java Log: ENVERS-26: retrieving versions of unidirectional one-to-many associations Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-21 10:19:09 UTC (rev 116) @@ -37,7 +37,7 @@ import org.jboss.envers.entities.mapper.id.*; import org.jboss.envers.entities.mapper.relation.ToOneIdMapper; import org.jboss.envers.entities.mapper.relation.OneToOneIdMapper; -import org.jboss.envers.entities.mapper.relation.OneToManyIdMapper; +import org.jboss.envers.entities.mapper.relation.OneToManyBidirectionalMapper; import org.jboss.envers.entities.mapper.relation.OneToManyUnidirectionalMapper; import org.jboss.envers.tools.StringTools; import org.jboss.envers.tools.Tools; @@ -315,7 +315,7 @@ owningEntityName, ownedIdMapper); // Adding mapper for the id - mapper.addComposite(propertyName, new OneToManyIdMapper(owningReferencePropertyName, owningEntityName, + mapper.addComposite(propertyName, new OneToManyBidirectionalMapper(owningReferencePropertyName, owningEntityName, propertyName)); } @@ -340,7 +340,7 @@ IdMappingData referencingIdMapping = configuration.getIdMappingData(); IdMappingData referencedIdMapping = referencedConfiguration.getIdMappingData(); - String referencingPrefix = entityName + "_"; + String referencingPrefix = StringTools.getLastComponent(entityName) + "_"; String referencedPrefix = property.getName() + "_"; // Name of the entity that will be used to store the relation between the two entities. @@ -374,10 +374,11 @@ addRevisionType(middleEntity); // Adding the property mapper - mapper.addComposite(property.getName(), new OneToManyUnidirectionalMapper(verEntCfg, property.getName(), - referencedEntityName, versionsMiddleEntityName, - referencingIdMapping.getIdMapper().prefixMappedProperties(referencingPrefix), - referencedIdMapping.getIdMapper().prefixMappedProperties(referencedPrefix))); + mapper.addComposite(property.getName(), new OneToManyUnidirectionalMapper(verEntCfg, entityName, + referencedEntityName, property.getName(), verEntCfg.getVersionsEntityName(referencedEntityName), + versionsMiddleEntityName, referencingIdMapping.getIdMapper().prefixMappedProperties(referencingPrefix), + referencedIdMapping.getIdMapper().prefixMappedProperties(referencedPrefix), + entitiesConfigurations.get(referencedEntityName).getIdMapper())); // TODO: ??? } Modified: trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/EntityInstantiator.java 2008-08-21 10:19:09 UTC (rev 116) @@ -29,6 +29,7 @@ import java.util.Map; import java.util.List; +import java.util.Collection; /** * @author Adam Warski (adam at warski dot org) @@ -75,7 +76,7 @@ Object primaryKey = idMapper.mapToIdFromMap(originalId); - verCfg.getEntCfg().get(entityName).getPropertyMapper().mapToEntityFromMap(ret, versionsEntity, primaryKey, + verCfg.getEntCfg().get(entityName).getPropertyMapper().mapToEntityFromMap(verCfg, ret, versionsEntity, primaryKey, versionsReader, revision); idMapper.mapToEntityFromMap(ret, originalId); @@ -83,9 +84,9 @@ } @SuppressWarnings({"unchecked"}) - public void addInstancesFromVersionsEntities(String entityName, List list, List versionsEntities, Number revision) { + public void addInstancesFromVersionsEntities(String entityName, Collection addTo, List versionsEntities, Number revision) { for (Map versionsEntity : versionsEntities) { - list.add(createInstanceFromVersionsEntity(entityName, versionsEntity, revision)); + addTo.add(createInstanceFromVersionsEntity(entityName, versionsEntity, revision)); } } } Modified: trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/MapPropertyMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -22,6 +22,7 @@ package org.jboss.envers.entities.mapper; import org.jboss.envers.ModificationStore; +import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.exception.VersionsException; @@ -66,7 +67,7 @@ return delegate.mapToMapFromEntity(newData, newObj, oldObj); } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { if (data == null || obj == null) { return; } @@ -77,17 +78,17 @@ try { Object subObj = ReflectHelper.getDefaultConstructor(getter.getReturnType()).newInstance(); setter.set(obj, subObj, null); - delegate.mapToEntityFromMap(subObj, (Map) data.get(propertyName), primaryKey, versionsReader, revision); + delegate.mapToEntityFromMap(verCfg, subObj, (Map) data.get(propertyName), primaryKey, versionsReader, revision); } catch (Exception e) { throw new VersionsException(e); } } - public List mapCollectionChangesFromCollections(String referencingPropertyName, + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, Serializable oldColl, Serializable id) { - return delegate.mapCollectionChangesFromCollections(referencingPropertyName, newColl, oldColl, id); + return delegate.mapCollectionChanges(referencingPropertyName, newColl, oldColl, id); } } Modified: trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/MultiPropertyMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -25,6 +25,7 @@ import org.hibernate.MappingException; import org.hibernate.collection.PersistentCollection; import org.jboss.envers.ModificationStore; +import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; @@ -101,19 +102,19 @@ return ret; } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { for (String propertyName : properties.keySet()) { - properties.get(propertyName).mapToEntityFromMap(obj, data, primaryKey, versionsReader, revision); + properties.get(propertyName).mapToEntityFromMap(verCfg, obj, data, primaryKey, versionsReader, revision); } } - public List mapCollectionChangesFromCollections(String referencingPropertyName, + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, Serializable oldColl, Serializable id) { PropertyMapper mapper = properties.get(referencingPropertyName); if (mapper != null) { - return mapper.mapCollectionChangesFromCollections(referencingPropertyName, newColl, oldColl, id); + return mapper.mapCollectionChanges(referencingPropertyName, newColl, oldColl, id); } else { return null; } Modified: trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/PropertyMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -22,6 +22,7 @@ package org.jboss.envers.entities.mapper; import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.collection.PersistentCollection; import java.util.Map; @@ -44,14 +45,15 @@ /** * Maps properties from the given map to the given object. + * @param verCfg Versions configuration. * @param obj Object to map to. * @param data Data to map from. * @param primaryKey Primary key of the object to which we map (for relations) * @param versionsReader VersionsReader for reading relations * @param revision Revision at which the obejct is read, for reading relations */ - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, - Number revision); + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, + VersionsReaderImplementor versionsReader, Number revision); /** * Maps collection changes @@ -61,8 +63,7 @@ * @param id Id of the object owning the collection. * @return List of changes that need to be performed on the persistent store. */ - public List mapCollectionChangesFromCollections(String referencingPropertyName, - PersistentCollection newColl, - Serializable oldColl, - Serializable id); + public List mapCollectionChanges(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, Serializable id); } Modified: trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/SinglePropertyMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -22,6 +22,7 @@ package org.jboss.envers.entities.mapper; import org.jboss.envers.ModificationStore; +import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.tools.Tools; @@ -60,7 +61,7 @@ return !Tools.objectsEqual(newObj, oldObj); } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { if (data == null || obj == null) { return; } @@ -69,7 +70,7 @@ setter.set(obj, data.get(propertyName), null); } - public List mapCollectionChangesFromCollections(String referencingPropertyName, + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, Serializable oldColl, Serializable id) { Modified: trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/SubclassPropertyMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -23,6 +23,7 @@ import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.ModificationStore; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.collection.PersistentCollection; import java.util.Map; @@ -57,20 +58,20 @@ return parentDiffs || mainDiffs; } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { - parentMapper.mapToEntityFromMap(obj, data, primaryKey, versionsReader, revision); - main.mapToEntityFromMap(obj, data, primaryKey, versionsReader, revision); + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + parentMapper.mapToEntityFromMap(verCfg, obj, data, primaryKey, versionsReader, revision); + main.mapToEntityFromMap(verCfg, obj, data, primaryKey, versionsReader, revision); } - public List mapCollectionChangesFromCollections(String referencingPropertyName, + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, Serializable oldColl, Serializable id) { - List collectionChanges = parentMapper.mapCollectionChangesFromCollections( + List collectionChanges = parentMapper.mapCollectionChanges( referencingPropertyName, newColl, oldColl, id); if (collectionChanges == null) { - return main.mapCollectionChangesFromCollections(referencingPropertyName, newColl, oldColl, id); + return main.mapCollectionChanges(referencingPropertyName, newColl, oldColl, id); } else { return collectionChanges; } Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -26,6 +26,7 @@ import org.hibernate.criterion.Conjunction; import java.util.Set; +import java.util.Iterator; /** * @author Adam Warski (adam at warski dot org) @@ -50,6 +51,71 @@ } } + public String getIdsEqualQuery(String prefix1, String prefix2) { + Set paramDatas = mapToQueryParametersFromId(null); + + StringBuilder query = new StringBuilder(); + + Iterator paramDataIter = paramDatas.iterator(); + + while (paramDataIter.hasNext()) { + QueryParameterData paramData = paramDataIter.next(); + query.append(paramData.getProperty(prefix1)).append(" = ").append(paramData.getProperty(prefix2)); + if (paramDataIter.hasNext()) { + query.append(" AND "); + } + } + + return query.toString(); + } + + public String getIdsEqualQuery(String prefix1, IdMapper mapper2, String prefix2) { + Set paramDatas1 = mapToQueryParametersFromId(null); + Set paramDatas2 = mapper2.mapToQueryParametersFromId(null); + + StringBuilder query = new StringBuilder(); + + Iterator paramDataIter1 = paramDatas1.iterator(); + Iterator paramDataIter2 = paramDatas2.iterator(); + while (paramDataIter1.hasNext()) { + QueryParameterData paramData1 = paramDataIter1.next(); + QueryParameterData paramData2 = paramDataIter2.next(); + query.append(paramData1.getProperty(prefix1)).append(" = ").append(paramData2.getProperty(prefix2)); + + if (paramDataIter1.hasNext()) { + query.append(" AND "); + } + } + + return query.toString(); + } + + public String getIdEqualsQuery(String prefix, boolean equals) { + Set paramDatas = mapToQueryParametersFromId(null); + + StringBuilder query = new StringBuilder(); + + Iterator paramDataIter = paramDatas.iterator(); + + while (paramDataIter.hasNext()) { + QueryParameterData paramData = paramDataIter.next(); + + query.append(paramData.getProperty(prefix)); + if (equals) { + query.append(" = "); + } else { + query.append(" != "); + } + query.append(":").append(paramData.getQueryParameterName()); + + if (paramDataIter.hasNext()) { + query.append(" AND "); + } + } + + return query.toString(); + } + public Criterion getIdEqualsCriterion(Object id, String prefix, boolean equals) { Set paramDatas = mapToQueryParametersFromId(id); Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -65,6 +65,15 @@ public Criterion getIdsEqualCriterion(String prefix1, String prefix2); /** + * Gets a query string, which contains equalities, which express the property that the id of the entity + * with alias prefix1, is equal to the id of the entity with alias prefix2 (the entity is the same). + * @param prefix1 First alias of the entity. + * @param prefix2 Second alias of the entity. + * @return A query string expressing the property described above. + */ + public String getIdsEqualQuery(String prefix1, String prefix2); + + /** * Gets a criteria object, which contains restrictions, which express the property that the id of the entity * with alias prefix, is equal to the given object. * @param id Value of id. @@ -73,4 +82,26 @@ * @return A criterion object expressing the property described above. */ public Criterion getIdEqualsCriterion(Object id, String prefix, boolean equals); + + /** + * Gets a query string, which contains equalities, which express the property that the id of the entity + * with alias prefix, is equal to some values (which are left to be specified later, by specifiying parameter + * values) + * @param prefix Alias of the entity (may be null). + * @param equals Should this query express the "=" relation or the "<>" relation. + * @return A query string expressing the property described above. + */ + public String getIdEqualsQuery(String prefix, boolean equals); + + /** + * Gets a query string, which contains equalities, which express the property that the id of the entity + * with alias prefix1, is equal to the id of the entity with alias prefix2, mapped by the second mapper + * (the second mapper must be for the same entity, but it can have, for example, prefixed properties). + * @param prefix1 First alias of the entity. + * @param mapper2 Second mapper for the same entity, which will be used to get properties for the right side + * of the equation. + * @param prefix2 Second alias of the entity. + * @return A query string expressing the property described above. + */ + public String getIdsEqualQuery(String prefix1, IdMapper mapper2, String prefix2); } Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/QueryParameterData.java 2008-08-21 10:19:09 UTC (rev 116) @@ -21,6 +21,8 @@ */ package org.jboss.envers.entities.mapper.id; +import org.hibernate.Query; + /** * @author Adam Warski (adam at warski dot org) */ @@ -44,4 +46,28 @@ public Object getValue() { return value; } + + public void setParameterValue(Query query) { + query.setParameter(flatEntityPropertyName, value); + } + + public String getQueryParameterName() { + return flatEntityPropertyName; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof QueryParameterData)) return false; + + QueryParameterData that = (QueryParameterData) o; + + if (flatEntityPropertyName != null ? !flatEntityPropertyName.equals(that.flatEntityPropertyName) : that.flatEntityPropertyName != null) + return false; + + return true; + } + + public int hashCode() { + return (flatEntityPropertyName != null ? flatEntityPropertyName.hashCode() : 0); + } } Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/AbstractOneToManyMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/AbstractOneToManyMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/AbstractOneToManyMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -0,0 +1,58 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.tools.reflection.ReflectionTools; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.ListProxy; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.SetProxy; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.hibernate.property.Getter; +import org.hibernate.property.Setter; + +import java.util.*; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public abstract class AbstractOneToManyMapper implements PropertyMapper { + private final String owningEntityName; + private final String propertyName; + + protected AbstractOneToManyMapper(String owningEntityName, String propertyName) { + this.owningEntityName = owningEntityName; + this.propertyName = propertyName; + } + + protected abstract Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, Class collectionClass); + + @SuppressWarnings({"unchecked"}) + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, + VersionsReaderImplementor versionsReader, Number revision) { + if (obj == null) { + return; + } + + Class entityClass = ReflectionTools.loadClass(owningEntityName); + + Getter getter = ReflectionTools.getGetter(obj.getClass(), propertyName); + Class collectionClass = getter.getReturnType(); + + // todo: investigate generics + Object value; + if (List.class.isAssignableFrom(collectionClass)) { + value = new ListProxy(getInitializator(verCfg, versionsReader, entityClass, primaryKey, revision, ArrayList.class)); + } else if (Set.class.isAssignableFrom(collectionClass) || Collection.class.isAssignableFrom(collectionClass)) { + value = new SetProxy(getInitializator(verCfg, versionsReader, entityClass, primaryKey, revision, HashSet.class)); + } else { + throw new VersionsException("Unsupported versioned collection type: " + collectionClass.getName()); + } + + Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); + setter.set(obj, value, null); + } +} Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java (from rev 115, trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -0,0 +1,64 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.entities.mapper.relation.lazy.OneToManyBidirectionalInitializor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.hibernate.collection.PersistentCollection; + +import java.util.*; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyBidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { + private final String owningReferencePropertyName; + + public OneToManyBidirectionalMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { + super(owningEntityName, propertyName); + + this.owningReferencePropertyName = owningReferencePropertyName; + } + + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + return false; + } + + protected Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, + Class collectionClass) { + return new OneToManyBidirectionalInitializor(versionsReader, entityClass, owningReferencePropertyName, primaryKey, + revision, collectionClass); + } + + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, + Serializable oldColl, Serializable id) { + return null; + } +} \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -2,9 +2,12 @@ import org.jboss.envers.entities.mapper.PropertyMapper; import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.lazy.OneToManyUnidirectionalInitializor; import org.jboss.envers.entities.mapper.id.IdMapper; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.configuration.VersionsConfiguration; import org.jboss.envers.RevisionType; import org.hibernate.collection.PersistentCollection; @@ -14,24 +17,34 @@ /** * @author Adam Warski (adam at warski dot org) */ -public class OneToManyUnidirectionalMapper implements PropertyMapper { +public class OneToManyUnidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { private final VersionsEntitiesConfiguration verEntCfg; + private final String referencedEntityName; private final String collectionReferencingPropertyName; - private final String referencedEntityName; + private final String versionsReferencedEntityName; private final String versionsMiddleEntityName; private final IdMapper referencingMiddleIdMapper; private final IdMapper referencedMiddleIdMapper; - public OneToManyUnidirectionalMapper(VersionsEntitiesConfiguration verEntCfg, - String collectionReferencingPropertyName, - String referencedEntityName, String versionsMiddleEntityName, - IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper) { + private final UnidirectionalRelationQueryGenerator queryGenerator; + + public OneToManyUnidirectionalMapper(VersionsEntitiesConfiguration verEntCfg, String referencingEntityName, + String referencedEntityName, String collectionReferencingPropertyName, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { + super(referencingEntityName, collectionReferencingPropertyName); + this.verEntCfg = verEntCfg; + this.referencedEntityName = referencedEntityName; this.collectionReferencingPropertyName = collectionReferencingPropertyName; - this.referencedEntityName = referencedEntityName; + this.versionsReferencedEntityName = versionsReferencedEntityName; this.versionsMiddleEntityName = versionsMiddleEntityName; this.referencingMiddleIdMapper = referencingMiddleIdMapper; this.referencedMiddleIdMapper = referencedMiddleIdMapper; + + queryGenerator = new UnidirectionalRelationQueryGenerator(verEntCfg, versionsReferencedEntityName, + versionsMiddleEntityName, referencingMiddleIdMapper, referencedMiddleIdMapper, referencedIdMapper); } private Collection getOldCollection(Serializable oldColl) { @@ -60,10 +73,9 @@ } @SuppressWarnings({"unchecked"}) - public List mapCollectionChangesFromCollections(String referencingPropertyName, - PersistentCollection newColl, - Serializable oldColl, - Serializable id) { + public List mapCollectionChanges(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, Serializable id) { if (!collectionReferencingPropertyName.equals(referencingPropertyName)) { return null; } @@ -90,10 +102,15 @@ @SuppressWarnings({"unchecked"}) public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + // Changes are mapped in the "mapCollectionChanges" method. return false; } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { - System.out.println("XXX"); + protected Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, Class collectionClass) { + return new OneToManyUnidirectionalInitializor(verCfg, referencedEntityName, queryGenerator, + versionsReader, primaryKey, revision, collectionClass); } } Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -27,6 +27,7 @@ import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.query.VersionsRestrictions; import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.property.Setter; import org.hibernate.NonUniqueResultException; import org.hibernate.collection.PersistentCollection; @@ -54,7 +55,7 @@ return false; } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { if (obj == null) { return; } @@ -77,7 +78,7 @@ setter.set(obj, value, null); } - public List mapCollectionChangesFromCollections(String referencingPropertyName, + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, Serializable oldColl, Serializable id) { Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/ToOneIdMapper.java 2008-08-21 10:19:09 UTC (rev 116) @@ -28,6 +28,7 @@ import org.jboss.envers.tools.reflection.ReflectionTools; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.entities.mapper.relation.lazy.ToOneDelegateSessionImplementor; +import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.property.Setter; import org.hibernate.collection.PersistentCollection; @@ -59,7 +60,7 @@ return !Tools.objectsEqual(newObj, oldObj); } - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { if (obj == null) { return; @@ -80,7 +81,7 @@ setter.set(obj, value, null); } - public List mapCollectionChangesFromCollections(String referencingPropertyName, + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, Serializable oldColl, Serializable id) { Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java 2008-08-21 10:19:09 UTC (rev 116) @@ -0,0 +1,93 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.id.QueryParameterData; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.RevisionType; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.hibernate.Query; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class UnidirectionalRelationQueryGenerator { + private final String queryString; + private final IdMapper referencingMiddleIdMapper; + + public UnidirectionalRelationQueryGenerator(VersionsEntitiesConfiguration verEntCfg, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { + this.referencingMiddleIdMapper = referencingMiddleIdMapper; + + /* + * The query that we need to create: + * SELECT e FROM versionsReferencedEntity e, middleEntity ee + * WHERE + * (selecting e entities at revision :revision) + * e.revision = (SELECT max(e2.revision) FROM referencedEntity e2 + * WHERE e2.revision <= :revision AND e2.id1 = e.id1) AND + * (only entities referenced by the association) + * ee.id1 = e.id1 AND + * ee.id2 = :id2 AND + * (the association at revision :revision) + * ee.revision = (SELECT max(ee2.revision) FROM middleEntity ee2 + * WHERE ee2.revision <= :revision AND ee2.id2 = :id2 AND ee2.id1 = ee.id1) AND + * (only non-deleted entities and associations) + * ee.revision_type != DEL AND + * e.revision_type != DEL + */ + String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); + + StringBuilder querySB = new StringBuilder(); + querySB + .append("SELECT e FROM ").append(versionsReferencedEntityName).append(" e") + .append(", ").append(versionsMiddleEntityName).append(" ee ") + .append("WHERE ") + // e.revision = (SELECT max(e2.revision) ... + .append("e.").append(revisionPropertyPath).append(" = (SELECT max(e2.").append(revisionPropertyPath) + .append(") FROM ").append(versionsReferencedEntityName).append(" e2 ") + // e2.revision <= :revision + .append("WHERE e2.").append(revisionPropertyPath).append(" <= :revision AND ") + // e2.id1 = e.id1) + .append(referencedIdMapper.getIdsEqualQuery("e." + originalIdPropertyName, "e2." + originalIdPropertyName)) + .append(") AND ") + // ee.id1 = e.id1 + .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, + referencedIdMapper, "e." + originalIdPropertyName)) + .append(" AND ") + // ee.id2 = :id2 + .append(referencingMiddleIdMapper.getIdEqualsQuery("ee." + originalIdPropertyName, true)) + .append(" AND ") + // ee.revision = (SELECT max(ee2.revision) ... + .append("ee.").append(revisionPropertyPath).append(" = (SELECT max(ee2.").append(revisionPropertyPath) + .append(") FROM ").append(versionsMiddleEntityName).append(" ee2 ") + // ee2.revision <= :revision + .append("WHERE ee2.").append(revisionPropertyPath).append(" <= :revision AND ") + // ee2.id2 = :id2) + .append(referencingMiddleIdMapper.getIdEqualsQuery("ee2." + originalIdPropertyName, true)) + .append(" AND ") + // ee2.id1 = ee.id1) + .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, "ee2." + originalIdPropertyName)) + .append(") AND ") + // e.revision_type != DEL AND + .append("e.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype") + .append(" AND ") + // ee.revision_type != DEL + .append("ee.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype"); + + queryString = querySB.toString(); + } + + public Query getQuery(VersionsReaderImplementor versionsReader, Object primaryKey, Number revision) { + Query query = versionsReader.getSession().createQuery(queryString); + query.setParameter("revision", revision); + query.setParameter("delrevisiontype", RevisionType.DEL); + for (QueryParameterData paramData: referencingMiddleIdMapper.mapToQueryParametersFromId(primaryKey)) { + paramData.setParameterValue(query); + } + + return query; + } +} Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java (from rev 113, trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java 2008-08-21 10:19:09 UTC (rev 116) @@ -0,0 +1,74 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.relation.lazy; + +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.exception.VersionsException; + +import java.util.Collection; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyBidirectionalInitializor implements Initializor { + private VersionsReaderImplementor versionsReader; + private Class entityClass; + private String owningReferencePropertyName; + private Object primaryKey; + private Number revision; + private Class collectionClass; + + public OneToManyBidirectionalInitializor(VersionsReaderImplementor versionsReader, Class entityClass, + String owningReferencePropertyName, Object primaryKey, Number revision, + Class collectionClass) { + this.versionsReader = versionsReader; + this.entityClass = entityClass; + this.owningReferencePropertyName = owningReferencePropertyName; + this.primaryKey = primaryKey; + this.revision = revision; + this.collectionClass = collectionClass; + } + + @SuppressWarnings({"unchecked"}) + public T initialize() { + List queryResult = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) + .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getResultList(); + + if (collectionClass.isAssignableFrom(queryResult.getClass())) { + return (T) queryResult; + } else { + Collection result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + result.addAll(queryResult); + + return (T) result; + } + } +} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyInitializor.java 2008-08-21 10:19:09 UTC (rev 116) @@ -1,74 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.entities.mapper.relation.lazy; - -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.query.VersionsRestrictions; -import org.jboss.envers.exception.VersionsException; - -import java.util.Collection; -import java.util.List; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyInitializor implements Initializor { - private VersionsReaderImplementor versionsReader; - private Class entityClass; - private String owningReferencePropertyName; - private Object primaryKey; - private Number revision; - private Class collectionClass; - - public OneToManyInitializor(VersionsReaderImplementor versionsReader, Class entityClass, - String owningReferencePropertyName, Object primaryKey, Number revision, - Class collectionClass) { - this.versionsReader = versionsReader; - this.entityClass = entityClass; - this.owningReferencePropertyName = owningReferencePropertyName; - this.primaryKey = primaryKey; - this.revision = revision; - this.collectionClass = collectionClass; - } - - @SuppressWarnings({"unchecked"}) - public T initialize() { - List queryResult = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) - .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getResultList(); - - if (collectionClass.isAssignableFrom(queryResult.getClass())) { - return (T) queryResult; - } else { - Collection result; - try { - result = collectionClass.newInstance(); - } catch (Exception e) { - throw new VersionsException(e); - } - - result.addAll(queryResult); - - return (T) result; - } - } -} Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java 2008-08-21 10:19:09 UTC (rev 116) @@ -0,0 +1,55 @@ +package org.jboss.envers.entities.mapper.relation.lazy; + +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.UnidirectionalRelationQueryGenerator; +import org.jboss.envers.entities.EntityInstantiator; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; + +import java.util.Collection; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyUnidirectionalInitializor implements Initializor { + private final VersionsConfiguration verCfg; + private final String entityName; + private final UnidirectionalRelationQueryGenerator queryGenerator; + private final VersionsReaderImplementor versionsReader; + private final Object primaryKey; + private final Number revision; + private final Class collectionClass; + + public OneToManyUnidirectionalInitializor(VersionsConfiguration verCfg, String entityName, + UnidirectionalRelationQueryGenerator queryGenerator, + VersionsReaderImplementor versionsReader, Object primaryKey, + Number revision, Class collectionClass) { + this.verCfg = verCfg; + this.entityName = entityName; + this.queryGenerator = queryGenerator; + this.versionsReader = versionsReader; + this.primaryKey = primaryKey; + this.revision = revision; + this.collectionClass = collectionClass; + } + + @SuppressWarnings({"unchecked"}) + public T initialize() { + EntityInstantiator entityInstantiator = new EntityInstantiator(verCfg, versionsReader); + + List queryResult = queryGenerator.getQuery(versionsReader, primaryKey, revision).list(); + + T result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + entityInstantiator.addInstancesFromVersionsEntities(entityName, result, queryResult, revision); + + return result; + } +} Modified: trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java =================================================================== --- trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/query/VersionsQueryCreator.java 2008-08-21 10:19:09 UTC (rev 116) @@ -26,19 +26,16 @@ import org.jboss.envers.query.impl.RevisionsOfEntityQuery; import static org.jboss.envers.tools.ArgumentsTools.*; import org.jboss.envers.configuration.VersionsConfiguration; -import org.hibernate.Session; /** * @author Adam Warski (adam at warski dot org) */ public class VersionsQueryCreator { private final VersionsConfiguration verCfg; - private final Session session; private final VersionsReaderImplementor versionsReaderImplementor; - public VersionsQueryCreator(VersionsConfiguration verCfg, Session session, VersionsReaderImplementor versionsReaderImplementor) { + public VersionsQueryCreator(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReaderImplementor) { this.verCfg = verCfg; - this.session = session; this.versionsReaderImplementor = versionsReaderImplementor; } @@ -54,7 +51,7 @@ public VersionsQuery forEntitiesAtRevision(Class c, Number revision) { checkNotNull(revision, "Entity revision"); checkPositive(revision, "Entity revision"); - return new EntitiesAtRevisionQuery(verCfg, session, versionsReaderImplementor, c, revision); + return new EntitiesAtRevisionQuery(verCfg, versionsReaderImplementor, c, revision); } /** @@ -73,6 +70,6 @@ * unless an order or projection is added. */ public VersionsQuery forRevisionsOfEntity(Class c, boolean selectEntitiesOnly, boolean selectDeletedEntities) { - return new RevisionsOfEntityQuery(verCfg, session, versionsReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities); + return new RevisionsOfEntityQuery(verCfg, versionsReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities); } } Modified: trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/query/impl/AbstractVersionsQuery.java 2008-08-21 10:19:09 UTC (rev 116) @@ -55,8 +55,8 @@ protected final VersionsConfiguration verCfg; - protected AbstractVersionsQuery(VersionsConfiguration verCfg, Session session, - VersionsReaderImplementor versionsReader, Class cls) { + protected AbstractVersionsQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, + Class cls) { this.verCfg = verCfg; criterions = new ArrayList(); @@ -64,7 +64,7 @@ entityName = cls.getName(); versionsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(entityName); - versionsCriteria = session.createCriteria(versionsEntityName, "e"); + versionsCriteria = versionsReader.getSession().createCriteria(versionsEntityName, "e"); } public abstract List list() throws VersionsException; Modified: trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/query/impl/EntitiesAtRevisionQuery.java 2008-08-21 10:19:09 UTC (rev 116) @@ -27,7 +27,6 @@ import org.jboss.envers.configuration.VersionsEntitiesConfiguration; import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.*; -import org.hibernate.Session; import java.util.List; import java.util.ArrayList; @@ -38,10 +37,10 @@ public class EntitiesAtRevisionQuery extends AbstractVersionsQuery { private final Number revision; - public EntitiesAtRevisionQuery(VersionsConfiguration verCfg, Session session, + public EntitiesAtRevisionQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, Class cls, Number revision) { - super(verCfg, session, versionsReader, cls); + super(verCfg, versionsReader, cls); this.revision = revision; } Modified: trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-21 10:19:09 UTC (rev 116) @@ -29,7 +29,6 @@ import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Order; import org.hibernate.criterion.Property; -import org.hibernate.Session; import java.util.List; import java.util.ArrayList; @@ -42,11 +41,11 @@ private final boolean selectEntitiesOnly; private final boolean selectDeletedEntities; - public RevisionsOfEntityQuery(VersionsConfiguration verCfg, Session session, + public RevisionsOfEntityQuery(VersionsConfiguration verCfg, VersionsReaderImplementor versionsReader, Class cls, boolean selectEntitiesOnly, boolean selectDeletedEntities) { - super(verCfg, session, versionsReader, cls); + super(verCfg, versionsReader, cls); this.selectEntitiesOnly = selectEntitiesOnly; this.selectDeletedEntities = selectDeletedEntities; Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImpl.java 2008-08-21 10:19:09 UTC (rev 116) @@ -64,6 +64,10 @@ return sessionImplementor; } + public Session getSession() { + return session; + } + @SuppressWarnings({"unchecked"}) public T find(Class cls, Object primaryKey, Number revision) throws IllegalArgumentException, NotVersionedException, IllegalStateException { @@ -170,6 +174,6 @@ } public VersionsQueryCreator createQuery() { - return new VersionsQueryCreator(verCfg, session, this); + return new VersionsQueryCreator(verCfg, this); } } Modified: trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java =================================================================== --- trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/reader/VersionsReaderImplementor.java 2008-08-21 10:19:09 UTC (rev 116) @@ -22,6 +22,7 @@ package org.jboss.envers.reader; import org.hibernate.engine.SessionImplementor; +import org.hibernate.Session; import org.jboss.envers.VersionsReader; /** @@ -30,4 +31,5 @@ */ public interface VersionsReaderImplementor extends VersionsReader { SessionImplementor getSessionImplementor(); + Session getSession(); } Deleted: trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-21 10:19:09 UTC (rev 116) @@ -1,78 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.synchronization.work; - -import org.hibernate.Session; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.RevisionType; - -import java.io.Serializable; -import java.util.Map; -import java.util.HashMap; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class CollectionChangeWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { - private final Object entity; - - public CollectionChangeWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id, Object entity) { - super(entityName, verCfg, id); - - this.entity = entity; - } - - public boolean containsWork() { - return true; - } - - public void perform(Session session, Number revision) { - Map data = new HashMap(); - fillDataWithId(data, revision, RevisionType.MOD); - - verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().mapToMapFromEntity(data, entity, null); - - session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); - - setPerformed(data); - } - - public KeepCheckResult check(AddWorkUnit second) { - return KeepCheckResult.SECOND; - } - - public KeepCheckResult check(ModWorkUnit second) { - return KeepCheckResult.SECOND; - } - - public KeepCheckResult check(DelWorkUnit second) { - return KeepCheckResult.SECOND; - } - - public KeepCheckResult check(CollectionChangeWorkUnit second) { - return KeepCheckResult.FIRST; - } - - public KeepCheckResult dispatch(KeepCheckVisitor first) { - return first.check(this); - } -} Modified: trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-21 10:19:09 UTC (rev 116) @@ -24,7 +24,7 @@ String referencingPropertyName = role.substring(entityName.length() + 1); collectionChanges = verCfg.getEntCfg().get(getEntityName()).getPropertyMapper() - .mapCollectionChangesFromCollections(referencingPropertyName, collection, snapshot, id); + .mapCollectionChanges(referencingPropertyName, collection, snapshot, id); } public boolean containsWork() { Modified: trunk/src/main/org/jboss/envers/tools/StringTools.java =================================================================== --- trunk/src/main/org/jboss/envers/tools/StringTools.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/main/org/jboss/envers/tools/StringTools.java 2008-08-21 10:19:09 UTC (rev 116) @@ -28,4 +28,17 @@ public static boolean isEmpty(String s) { return s == null || "".equals(s); } + + public static String getLastComponent(String s) { + if (s == null) { + return null; + } + + int lastDot = s.lastIndexOf("."); + if (lastDot == -1) { + return s; + } else { + return s.substring(lastDot + 1); + } + } } Modified: trunk/src/test/org/jboss/envers/test/working/WorkingMain.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-20 11:44:45 UTC (rev 115) +++ trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-21 10:19:09 UTC (rev 116) @@ -116,6 +116,12 @@ entityManager.getTransaction().begin(); VersionsReader vr = VersionsReaderFactory.get(entityManager); + System.out.println("1 " + vr.find(WorkingEntity2.class, we2.getId2(), 1).getWe1s()); + System.out.println("2 " + vr.find(WorkingEntity2.class, we2.getId2(), 2).getWe1s()); + System.out.println("3 " + vr.find(WorkingEntity2.class, we2.getId2(), 3).getWe1s()); + System.out.println("4 " + vr.find(WorkingEntity2.class, we2.getId2(), 4).getWe1s()); + System.out.println("5 " + vr.find(WorkingEntity2.class, we2.getId2(), 5).getWe1s()); + System.out.println("6 " + vr.find(WorkingEntity2.class, we2.getId2(), 6).getWe1s()); entityManager.getTransaction().commit(); } From jboss-envers-commits at lists.jboss.org Thu Aug 21 07:18:53 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 21 Aug 2008 07:18:53 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r117 - in trunk/src: main/org/jboss/envers/entities/mapper/relation/lazy and 7 other directories. Message-ID: Author: adamw Date: 2008-08-21 07:18:53 -0400 (Thu, 21 Aug 2008) New Revision: 117 Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/SetRefCollEntity.java trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/ trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java Removed: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java Log: ENVERS-26: refactoring, first test Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java 2008-08-21 11:18:53 UTC (rev 117) @@ -1,64 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.PropertyMapper; -import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.entities.mapper.relation.lazy.OneToManyBidirectionalInitializor; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.hibernate.collection.PersistentCollection; - -import java.util.*; -import java.io.Serializable; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyBidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { - private final String owningReferencePropertyName; - - public OneToManyBidirectionalMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { - super(owningEntityName, propertyName); - - this.owningReferencePropertyName = owningReferencePropertyName; - } - - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - return false; - } - - protected Initializor getInitializator(VersionsConfiguration verCfg, - VersionsReaderImplementor versionsReader, - Class entityClass, Object primaryKey, - Number revision, - Class collectionClass) { - return new OneToManyBidirectionalInitializor(versionsReader, entityClass, owningReferencePropertyName, primaryKey, - revision, collectionClass); - } - - public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, - Serializable oldColl, Serializable id) { - return null; - } -} \ No newline at end of file Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,64 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.entities.mapper.relation.lazy.OneToManyBidirectionalInitializor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.hibernate.collection.PersistentCollection; + +import java.util.*; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyBidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { + private final String owningReferencePropertyName; + + public OneToManyBidirectionalMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { + super(owningEntityName, propertyName); + + this.owningReferencePropertyName = owningReferencePropertyName; + } + + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + return false; + } + + protected Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, + Class collectionClass) { + return new OneToManyBidirectionalInitializor(versionsReader, entityClass, owningReferencePropertyName, primaryKey, + revision, collectionClass); + } + + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, + Serializable oldColl, Serializable id) { + return null; + } +} \ No newline at end of file Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyIdMapper.java 2008-08-21 11:18:53 UTC (rev 117) @@ -1,90 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.PropertyMapper; -import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.entities.mapper.relation.lazy.OneToManyInitializor; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.ListProxy; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.SetProxy; -import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.tools.reflection.ReflectionTools; -import org.hibernate.property.Setter; -import org.hibernate.property.Getter; -import org.hibernate.collection.PersistentCollection; - -import java.util.*; -import java.io.Serializable; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyIdMapper implements PropertyMapper { - private final String owningReferencePropertyName; - private final String owningEntityName; - private final String propertyName; - - public OneToManyIdMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { - this.owningReferencePropertyName = owningReferencePropertyName; - this.owningEntityName = owningEntityName; - this.propertyName = propertyName; - } - - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - return false; - } - - @SuppressWarnings({"unchecked"}) - public void mapToEntityFromMap(Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { - if (obj == null) { - return; - } - - Class entityClass = ReflectionTools.loadClass(owningEntityName); - - Getter getter = ReflectionTools.getGetter(obj.getClass(), propertyName); - Class collectionClass = getter.getReturnType(); - - // todo: investigate generics - Object value; - if (List.class.isAssignableFrom(collectionClass)) { - value = new ListProxy(new OneToManyInitializor(versionsReader, entityClass, - owningReferencePropertyName, primaryKey, revision, ArrayList.class)); - } else if (Set.class.isAssignableFrom(collectionClass) || Collection.class.isAssignableFrom(collectionClass)) { - value = new SetProxy(new OneToManyInitializor(versionsReader, entityClass, - owningReferencePropertyName, primaryKey, revision, HashSet.class)); - } else { - throw new VersionsException("Unsupported versioned collection type: " + collectionClass.getName()); - } - - Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); - setter.set(obj, value, null); - } - - public List mapCollectionChangesFromCollections(String referencingPropertyName, - PersistentCollection newColl, - Serializable oldColl, - Serializable id) { - return null; - } -} \ No newline at end of file Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-21 11:18:53 UTC (rev 117) @@ -1,116 +0,0 @@ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.PropertyMapper; -import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.entities.mapper.relation.lazy.OneToManyUnidirectionalInitializor; -import org.jboss.envers.entities.mapper.id.IdMapper; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.RevisionType; -import org.hibernate.collection.PersistentCollection; - -import java.util.*; -import java.io.Serializable; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyUnidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { - private final VersionsEntitiesConfiguration verEntCfg; - private final String referencedEntityName; - private final String collectionReferencingPropertyName; - private final String versionsReferencedEntityName; - private final String versionsMiddleEntityName; - private final IdMapper referencingMiddleIdMapper; - private final IdMapper referencedMiddleIdMapper; - - private final UnidirectionalRelationQueryGenerator queryGenerator; - - public OneToManyUnidirectionalMapper(VersionsEntitiesConfiguration verEntCfg, String referencingEntityName, - String referencedEntityName, String collectionReferencingPropertyName, - String versionsReferencedEntityName, String versionsMiddleEntityName, - IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, - IdMapper referencedIdMapper) { - super(referencingEntityName, collectionReferencingPropertyName); - - this.verEntCfg = verEntCfg; - this.referencedEntityName = referencedEntityName; - this.collectionReferencingPropertyName = collectionReferencingPropertyName; - this.versionsReferencedEntityName = versionsReferencedEntityName; - this.versionsMiddleEntityName = versionsMiddleEntityName; - this.referencingMiddleIdMapper = referencingMiddleIdMapper; - this.referencedMiddleIdMapper = referencedMiddleIdMapper; - - queryGenerator = new UnidirectionalRelationQueryGenerator(verEntCfg, versionsReferencedEntityName, - versionsMiddleEntityName, referencingMiddleIdMapper, referencedMiddleIdMapper, referencedIdMapper); - } - - private Collection getOldCollection(Serializable oldColl) { - if (oldColl instanceof Map) { - return ((Map) oldColl).keySet(); - } else { - return (Collection) oldColl; - } - } - - private void addCollectionChanges(List collectionChanges, Set changed, - RevisionType revisionType, Serializable id) { - for (Object changedEntity : changed) { - Map entityData = new HashMap(); - Map originalId = new HashMap(); - entityData.put(verEntCfg.getOriginalIdPropName(), originalId); - - collectionChanges.add(new PersistentCollectionChangeData(versionsMiddleEntityName, entityData)); - referencingMiddleIdMapper.mapToMapFromId(originalId, id); - referencedMiddleIdMapper.mapToMapFromEntity(originalId, changedEntity); - - entityData.put(verEntCfg.getRevisionTypePropName(), revisionType); - - System.out.println("entityData = " + entityData); - } - } - - @SuppressWarnings({"unchecked"}) - public List mapCollectionChanges(String referencingPropertyName, - PersistentCollection newColl, - Serializable oldColl, Serializable id) { - if (!collectionReferencingPropertyName.equals(referencingPropertyName)) { - return null; - } - - List collectionChanges = new ArrayList(); - - Collection newCollection = (Collection) newColl; - Collection oldCollection = getOldCollection(oldColl); - - Set added = new HashSet(); - if (newColl != null) { added.addAll(newCollection); } - if (oldColl != null) { added.removeAll(oldCollection); } - - addCollectionChanges(collectionChanges, added, RevisionType.ADD, id); - - Set deleted = new HashSet(); - if (oldColl != null) { deleted.addAll(oldCollection); } - if (newColl != null) { deleted.removeAll(newCollection); } - - addCollectionChanges(collectionChanges, deleted, RevisionType.DEL, id); - - return collectionChanges; - } - - @SuppressWarnings({"unchecked"}) - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - // Changes are mapped in the "mapCollectionChanges" method. - return false; - } - - protected Initializor getInitializator(VersionsConfiguration verCfg, - VersionsReaderImplementor versionsReader, - Class entityClass, Object primaryKey, - Number revision, Class collectionClass) { - return new OneToManyUnidirectionalInitializor(verCfg, referencedEntityName, queryGenerator, - versionsReader, primaryKey, revision, collectionClass); - } -} Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,112 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.lazy.OneToManyUnidirectionalInitializor; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.RevisionType; +import org.hibernate.collection.PersistentCollection; + +import java.util.*; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyUnidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { + private final VersionsEntitiesConfiguration verEntCfg; + private final String referencedEntityName; + private final String collectionReferencingPropertyName; + private final String versionsMiddleEntityName; + private final IdMapper referencingMiddleIdMapper; + private final IdMapper referencedMiddleIdMapper; + + private final UnidirectionalRelationQueryGenerator queryGenerator; + + public OneToManyUnidirectionalMapper(VersionsEntitiesConfiguration verEntCfg, String referencingEntityName, + String referencedEntityName, String collectionReferencingPropertyName, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { + super(referencingEntityName, collectionReferencingPropertyName); + + this.verEntCfg = verEntCfg; + this.referencedEntityName = referencedEntityName; + this.collectionReferencingPropertyName = collectionReferencingPropertyName; + this.versionsMiddleEntityName = versionsMiddleEntityName; + this.referencingMiddleIdMapper = referencingMiddleIdMapper; + this.referencedMiddleIdMapper = referencedMiddleIdMapper; + + queryGenerator = new UnidirectionalRelationQueryGenerator(verEntCfg, versionsReferencedEntityName, + versionsMiddleEntityName, referencingMiddleIdMapper, referencedMiddleIdMapper, referencedIdMapper); + } + + private Collection getOldCollection(Serializable oldColl) { + if (oldColl instanceof Map) { + return ((Map) oldColl).keySet(); + } else { + return (Collection) oldColl; + } + } + + private void addCollectionChanges(List collectionChanges, Set changed, + RevisionType revisionType, Serializable id) { + for (Object changedEntity : changed) { + Map entityData = new HashMap(); + Map originalId = new HashMap(); + entityData.put(verEntCfg.getOriginalIdPropName(), originalId); + + collectionChanges.add(new PersistentCollectionChangeData(versionsMiddleEntityName, entityData)); + referencingMiddleIdMapper.mapToMapFromId(originalId, id); + referencedMiddleIdMapper.mapToMapFromEntity(originalId, changedEntity); + + entityData.put(verEntCfg.getRevisionTypePropName(), revisionType); + } + } + + @SuppressWarnings({"unchecked"}) + public List mapCollectionChanges(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, Serializable id) { + if (!collectionReferencingPropertyName.equals(referencingPropertyName)) { + return null; + } + + List collectionChanges = new ArrayList(); + + Collection newCollection = (Collection) newColl; + Collection oldCollection = getOldCollection(oldColl); + + Set added = new HashSet(); + if (newColl != null) { added.addAll(newCollection); } + if (oldColl != null) { added.removeAll(oldCollection); } + + addCollectionChanges(collectionChanges, added, RevisionType.ADD, id); + + Set deleted = new HashSet(); + if (oldColl != null) { deleted.addAll(oldCollection); } + if (newColl != null) { deleted.removeAll(newCollection); } + + addCollectionChanges(collectionChanges, deleted, RevisionType.DEL, id); + + return collectionChanges; + } + + @SuppressWarnings({"unchecked"}) + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + // Changes are mapped in the "mapCollectionChanges" method. + return false; + } + + protected Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, Class collectionClass) { + return new OneToManyUnidirectionalInitializor(verCfg, referencedEntityName, queryGenerator, + versionsReader, primaryKey, revision, collectionClass); + } +} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java 2008-08-21 11:18:53 UTC (rev 117) @@ -1,93 +0,0 @@ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.id.QueryParameterData; -import org.jboss.envers.entities.mapper.id.IdMapper; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; -import org.jboss.envers.RevisionType; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.hibernate.Query; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class UnidirectionalRelationQueryGenerator { - private final String queryString; - private final IdMapper referencingMiddleIdMapper; - - public UnidirectionalRelationQueryGenerator(VersionsEntitiesConfiguration verEntCfg, - String versionsReferencedEntityName, String versionsMiddleEntityName, - IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, - IdMapper referencedIdMapper) { - this.referencingMiddleIdMapper = referencingMiddleIdMapper; - - /* - * The query that we need to create: - * SELECT e FROM versionsReferencedEntity e, middleEntity ee - * WHERE - * (selecting e entities at revision :revision) - * e.revision = (SELECT max(e2.revision) FROM referencedEntity e2 - * WHERE e2.revision <= :revision AND e2.id1 = e.id1) AND - * (only entities referenced by the association) - * ee.id1 = e.id1 AND - * ee.id2 = :id2 AND - * (the association at revision :revision) - * ee.revision = (SELECT max(ee2.revision) FROM middleEntity ee2 - * WHERE ee2.revision <= :revision AND ee2.id2 = :id2 AND ee2.id1 = ee.id1) AND - * (only non-deleted entities and associations) - * ee.revision_type != DEL AND - * e.revision_type != DEL - */ - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); - String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); - - StringBuilder querySB = new StringBuilder(); - querySB - .append("SELECT e FROM ").append(versionsReferencedEntityName).append(" e") - .append(", ").append(versionsMiddleEntityName).append(" ee ") - .append("WHERE ") - // e.revision = (SELECT max(e2.revision) ... - .append("e.").append(revisionPropertyPath).append(" = (SELECT max(e2.").append(revisionPropertyPath) - .append(") FROM ").append(versionsReferencedEntityName).append(" e2 ") - // e2.revision <= :revision - .append("WHERE e2.").append(revisionPropertyPath).append(" <= :revision AND ") - // e2.id1 = e.id1) - .append(referencedIdMapper.getIdsEqualQuery("e." + originalIdPropertyName, "e2." + originalIdPropertyName)) - .append(") AND ") - // ee.id1 = e.id1 - .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, - referencedIdMapper, "e." + originalIdPropertyName)) - .append(" AND ") - // ee.id2 = :id2 - .append(referencingMiddleIdMapper.getIdEqualsQuery("ee." + originalIdPropertyName, true)) - .append(" AND ") - // ee.revision = (SELECT max(ee2.revision) ... - .append("ee.").append(revisionPropertyPath).append(" = (SELECT max(ee2.").append(revisionPropertyPath) - .append(") FROM ").append(versionsMiddleEntityName).append(" ee2 ") - // ee2.revision <= :revision - .append("WHERE ee2.").append(revisionPropertyPath).append(" <= :revision AND ") - // ee2.id2 = :id2) - .append(referencingMiddleIdMapper.getIdEqualsQuery("ee2." + originalIdPropertyName, true)) - .append(" AND ") - // ee2.id1 = ee.id1) - .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, "ee2." + originalIdPropertyName)) - .append(") AND ") - // e.revision_type != DEL AND - .append("e.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype") - .append(" AND ") - // ee.revision_type != DEL - .append("ee.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype"); - - queryString = querySB.toString(); - } - - public Query getQuery(VersionsReaderImplementor versionsReader, Object primaryKey, Number revision) { - Query query = versionsReader.getSession().createQuery(queryString); - query.setParameter("revision", revision); - query.setParameter("delrevisiontype", RevisionType.DEL); - for (QueryParameterData paramData: referencingMiddleIdMapper.mapToQueryParametersFromId(primaryKey)) { - paramData.setParameterValue(query); - } - - return query; - } -} Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,93 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.id.QueryParameterData; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.RevisionType; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.hibernate.Query; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class UnidirectionalRelationQueryGenerator { + private final String queryString; + private final IdMapper referencingMiddleIdMapper; + + public UnidirectionalRelationQueryGenerator(VersionsEntitiesConfiguration verEntCfg, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { + this.referencingMiddleIdMapper = referencingMiddleIdMapper; + + /* + * The query that we need to create: + * SELECT e FROM versionsReferencedEntity e, middleEntity ee + * WHERE + * (selecting e entities at revision :revision) + * e.revision = (SELECT max(e2.revision) FROM referencedEntity e2 + * WHERE e2.revision <= :revision AND e2.id1 = e.id1) AND + * (only entities referenced by the association) + * ee.id1 = e.id1 AND + * ee.id2 = :id2 AND + * (the association at revision :revision) + * ee.revision = (SELECT max(ee2.revision) FROM middleEntity ee2 + * WHERE ee2.revision <= :revision AND ee2.id2 = :id2 AND ee2.id1 = ee.id1) AND + * (only non-deleted entities and associations) + * ee.revision_type != DEL AND + * e.revision_type != DEL + */ + String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); + + StringBuilder querySB = new StringBuilder(); + querySB + .append("SELECT e FROM ").append(versionsReferencedEntityName).append(" e") + .append(", ").append(versionsMiddleEntityName).append(" ee ") + .append("WHERE ") + // e.revision = (SELECT max(e2.revision) ... + .append("e.").append(revisionPropertyPath).append(" = (SELECT max(e2.").append(revisionPropertyPath) + .append(") FROM ").append(versionsReferencedEntityName).append(" e2 ") + // e2.revision <= :revision + .append("WHERE e2.").append(revisionPropertyPath).append(" <= :revision AND ") + // e2.id1 = e.id1) + .append(referencedIdMapper.getIdsEqualQuery("e." + originalIdPropertyName, "e2." + originalIdPropertyName)) + .append(") AND ") + // ee.id1 = e.id1 + .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, + referencedIdMapper, "e." + originalIdPropertyName)) + .append(" AND ") + // ee.id2 = :id2 + .append(referencingMiddleIdMapper.getIdEqualsQuery("ee." + originalIdPropertyName, true)) + .append(" AND ") + // ee.revision = (SELECT max(ee2.revision) ... + .append("ee.").append(revisionPropertyPath).append(" = (SELECT max(ee2.").append(revisionPropertyPath) + .append(") FROM ").append(versionsMiddleEntityName).append(" ee2 ") + // ee2.revision <= :revision + .append("WHERE ee2.").append(revisionPropertyPath).append(" <= :revision AND ") + // ee2.id2 = :id2) + .append(referencingMiddleIdMapper.getIdEqualsQuery("ee2." + originalIdPropertyName, true)) + .append(" AND ") + // ee2.id1 = ee.id1) + .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, "ee2." + originalIdPropertyName)) + .append(") AND ") + // e.revision_type != DEL AND + .append("e.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype") + .append(" AND ") + // ee.revision_type != DEL + .append("ee.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype"); + + queryString = querySB.toString(); + } + + public Query getQuery(VersionsReaderImplementor versionsReader, Object primaryKey, Number revision) { + Query query = versionsReader.getSession().createQuery(queryString); + query.setParameter("revision", revision); + query.setParameter("delrevisiontype", RevisionType.DEL); + for (QueryParameterData paramData: referencingMiddleIdMapper.mapToQueryParametersFromId(primaryKey)) { + paramData.setParameterValue(query); + } + + return query; + } +} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java 2008-08-21 11:18:53 UTC (rev 117) @@ -1,74 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.entities.mapper.relation.lazy; - -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.query.VersionsRestrictions; -import org.jboss.envers.exception.VersionsException; - -import java.util.Collection; -import java.util.List; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyBidirectionalInitializor implements Initializor { - private VersionsReaderImplementor versionsReader; - private Class entityClass; - private String owningReferencePropertyName; - private Object primaryKey; - private Number revision; - private Class collectionClass; - - public OneToManyBidirectionalInitializor(VersionsReaderImplementor versionsReader, Class entityClass, - String owningReferencePropertyName, Object primaryKey, Number revision, - Class collectionClass) { - this.versionsReader = versionsReader; - this.entityClass = entityClass; - this.owningReferencePropertyName = owningReferencePropertyName; - this.primaryKey = primaryKey; - this.revision = revision; - this.collectionClass = collectionClass; - } - - @SuppressWarnings({"unchecked"}) - public T initialize() { - List queryResult = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) - .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getResultList(); - - if (collectionClass.isAssignableFrom(queryResult.getClass())) { - return (T) queryResult; - } else { - Collection result; - try { - result = collectionClass.newInstance(); - } catch (Exception e) { - throw new VersionsException(e); - } - - result.addAll(queryResult); - - return (T) result; - } - } -} Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,74 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.relation.lazy; + +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.exception.VersionsException; + +import java.util.Collection; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyBidirectionalInitializor implements Initializor { + private VersionsReaderImplementor versionsReader; + private Class entityClass; + private String owningReferencePropertyName; + private Object primaryKey; + private Number revision; + private Class collectionClass; + + public OneToManyBidirectionalInitializor(VersionsReaderImplementor versionsReader, Class entityClass, + String owningReferencePropertyName, Object primaryKey, Number revision, + Class collectionClass) { + this.versionsReader = versionsReader; + this.entityClass = entityClass; + this.owningReferencePropertyName = owningReferencePropertyName; + this.primaryKey = primaryKey; + this.revision = revision; + this.collectionClass = collectionClass; + } + + @SuppressWarnings({"unchecked"}) + public T initialize() { + List queryResult = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) + .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getResultList(); + + if (collectionClass.isAssignableFrom(queryResult.getClass())) { + return (T) queryResult; + } else { + Collection result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + result.addAll(queryResult); + + return (T) result; + } + } +} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java 2008-08-21 11:18:53 UTC (rev 117) @@ -1,55 +0,0 @@ -package org.jboss.envers.entities.mapper.relation.lazy; - -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.entities.mapper.relation.UnidirectionalRelationQueryGenerator; -import org.jboss.envers.entities.EntityInstantiator; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.VersionsConfiguration; - -import java.util.Collection; -import java.util.List; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyUnidirectionalInitializor implements Initializor { - private final VersionsConfiguration verCfg; - private final String entityName; - private final UnidirectionalRelationQueryGenerator queryGenerator; - private final VersionsReaderImplementor versionsReader; - private final Object primaryKey; - private final Number revision; - private final Class collectionClass; - - public OneToManyUnidirectionalInitializor(VersionsConfiguration verCfg, String entityName, - UnidirectionalRelationQueryGenerator queryGenerator, - VersionsReaderImplementor versionsReader, Object primaryKey, - Number revision, Class collectionClass) { - this.verCfg = verCfg; - this.entityName = entityName; - this.queryGenerator = queryGenerator; - this.versionsReader = versionsReader; - this.primaryKey = primaryKey; - this.revision = revision; - this.collectionClass = collectionClass; - } - - @SuppressWarnings({"unchecked"}) - public T initialize() { - EntityInstantiator entityInstantiator = new EntityInstantiator(verCfg, versionsReader); - - List queryResult = queryGenerator.getQuery(versionsReader, primaryKey, revision).list(); - - T result; - try { - result = collectionClass.newInstance(); - } catch (Exception e) { - throw new VersionsException(e); - } - - entityInstantiator.addInstancesFromVersionsEntities(entityName, result, queryResult, revision); - - return result; - } -} Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,55 @@ +package org.jboss.envers.entities.mapper.relation.lazy; + +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.UnidirectionalRelationQueryGenerator; +import org.jboss.envers.entities.EntityInstantiator; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; + +import java.util.Collection; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyUnidirectionalInitializor implements Initializor { + private final VersionsConfiguration verCfg; + private final String entityName; + private final UnidirectionalRelationQueryGenerator queryGenerator; + private final VersionsReaderImplementor versionsReader; + private final Object primaryKey; + private final Number revision; + private final Class collectionClass; + + public OneToManyUnidirectionalInitializor(VersionsConfiguration verCfg, String entityName, + UnidirectionalRelationQueryGenerator queryGenerator, + VersionsReaderImplementor versionsReader, Object primaryKey, + Number revision, Class collectionClass) { + this.verCfg = verCfg; + this.entityName = entityName; + this.queryGenerator = queryGenerator; + this.versionsReader = versionsReader; + this.primaryKey = primaryKey; + this.revision = revision; + this.collectionClass = collectionClass; + } + + @SuppressWarnings({"unchecked"}) + public T initialize() { + EntityInstantiator entityInstantiator = new EntityInstantiator(verCfg, versionsReader); + + List queryResult = queryGenerator.getQuery(versionsReader, primaryKey, revision).list(); + + T result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + entityInstantiator.addInstancesFromVersionsEntities(entityName, result, queryResult, revision); + + return result; + } +} Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-21 11:18:53 UTC (rev 117) @@ -44,7 +44,7 @@ PostCollectionRecreateEventListener, Initializable { private VersionsConfiguration verCfg; - private void generateCollectionChangeWorkUnits(VersionsSync verSync, EntityPersister entityPersister, + private void generateBidirectionalCollectionChangeWorkUnits(VersionsSync verSync, EntityPersister entityPersister, String entityName, Object[] newState, Object[] oldState) { // Checking if this is enabled in configuration ... if (!verCfg.getGlobalCfg().isGenerateRevisionsForCollections()) { @@ -71,12 +71,12 @@ // (size increases). if (newValue != null) { Serializable id = (Serializable) idMapper.mapToIdFromEntity(newValue); - verSync.addWorkUnit(new BidirectionalCollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, newValue)); + verSync.addWorkUnit(new CollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, newValue)); } if (oldValue != null) { Serializable id = (Serializable) idMapper.mapToIdFromEntity(oldValue); - verSync.addWorkUnit(new BidirectionalCollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, oldValue)); + verSync.addWorkUnit(new CollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, oldValue)); } } } @@ -92,7 +92,7 @@ verSync.addWorkUnit(new AddWorkUnit(event.getPersister().getEntityName(), verCfg, event.getId(), event.getPersister(), event.getState())); - generateCollectionChangeWorkUnits(verSync, event.getPersister(), entityName, event.getState(), null); + generateBidirectionalCollectionChangeWorkUnits(verSync, event.getPersister(), entityName, event.getState(), null); } } @@ -105,7 +105,7 @@ verSync.addWorkUnit(new ModWorkUnit(event.getPersister().getEntityName(), verCfg, event.getId(), event.getPersister(), event.getState(), event.getOldState())); - generateCollectionChangeWorkUnits(verSync, event.getPersister(), entityName, event.getState(), event.getOldState()); + generateBidirectionalCollectionChangeWorkUnits(verSync, event.getPersister(), entityName, event.getState(), event.getOldState()); } } @@ -117,7 +117,7 @@ verSync.addWorkUnit(new DelWorkUnit(event.getPersister().getEntityName(), verCfg, event.getId())); - generateCollectionChangeWorkUnits(verSync, event.getPersister(), entityName, null, event.getDeletedState()); + generateBidirectionalCollectionChangeWorkUnits(verSync, event.getPersister(), entityName, null, event.getDeletedState()); } } @@ -128,8 +128,15 @@ if (verCfg.getEntCfg().isVersioned(entityName)) { VersionsSync verSync = verCfg.getSyncManager().get(event.getSession()); - verSync.addWorkUnit(new PersistentCollectionChangeWorkUnit(entityName, verCfg, newColl, - collectionEntry.getRole(), oldColl, event.getAffectedOwnerIdOrNull())); + VersionsWorkUnit workUnit = new PersistentCollectionChangeWorkUnit(entityName, verCfg, newColl, + collectionEntry.getRole(), oldColl, event.getAffectedOwnerIdOrNull()); + verSync.addWorkUnit(workUnit); + + if (workUnit.containsWork()) { + // There are some changes: a revision needs also be generated for the collection owner + verSync.addWorkUnit(new CollectionChangeWorkUnit(event.getAffectedOwnerEntityName(), verCfg, + event.getAffectedOwnerIdOrNull(), event.getAffectedOwnerOrNull())); + } } } Modified: trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-21 11:18:53 UTC (rev 117) @@ -72,7 +72,7 @@ return KeepCheckResult.NONE; } - public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { + public KeepCheckResult check(CollectionChangeWorkUnit second) { return KeepCheckResult.FIRST; } Copied: trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java (from rev 115, trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java) =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java (rev 0) +++ trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,78 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.synchronization.work; + +import org.hibernate.Session; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.RevisionType; + +import java.io.Serializable; +import java.util.Map; +import java.util.HashMap; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class CollectionChangeWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { + private final Object entity; + + public CollectionChangeWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id, Object entity) { + super(entityName, verCfg, id); + + this.entity = entity; + } + + public boolean containsWork() { + return true; + } + + public void perform(Session session, Number revision) { + Map data = new HashMap(); + fillDataWithId(data, revision, RevisionType.MOD); + + verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().mapToMapFromEntity(data, entity, null); + + session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); + + setPerformed(data); + } + + public KeepCheckResult check(AddWorkUnit second) { + return KeepCheckResult.SECOND; + } + + public KeepCheckResult check(ModWorkUnit second) { + return KeepCheckResult.SECOND; + } + + public KeepCheckResult check(DelWorkUnit second) { + return KeepCheckResult.SECOND; + } + + public KeepCheckResult check(CollectionChangeWorkUnit second) { + return KeepCheckResult.FIRST; + } + + public KeepCheckResult dispatch(KeepCheckVisitor first) { + return first.check(this); + } +} Modified: trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-21 11:18:53 UTC (rev 117) @@ -62,7 +62,7 @@ return KeepCheckResult.FIRST; } - public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { + public KeepCheckResult check(CollectionChangeWorkUnit second) { return KeepCheckResult.FIRST; } Modified: trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/synchronization/work/KeepCheckVisitor.java 2008-08-21 11:18:53 UTC (rev 117) @@ -29,5 +29,5 @@ KeepCheckResult check(AddWorkUnit second); KeepCheckResult check(ModWorkUnit second); KeepCheckResult check(DelWorkUnit second); - KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second); + KeepCheckResult check(CollectionChangeWorkUnit second); } Modified: trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-21 11:18:53 UTC (rev 117) @@ -70,7 +70,7 @@ return KeepCheckResult.SECOND; } - public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { + public KeepCheckResult check(CollectionChangeWorkUnit second) { return KeepCheckResult.FIRST; } Modified: trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-21 11:18:53 UTC (rev 117) @@ -56,7 +56,7 @@ return null; } - public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { + public KeepCheckResult check(CollectionChangeWorkUnit second) { return null; } Added: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/SetRefCollEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/SetRefCollEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/SetRefCollEntity.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,85 @@ +package org.jboss.envers.test.entities.onetomany.unidirectional; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.StrTestEntity; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import java.util.Set; + +/** + * Set collection of references entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class SetRefCollEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @OneToMany + private Set collection; + + public SetRefCollEntity() { + } + + public SetRefCollEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public SetRefCollEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getCollection() { + return collection; + } + + public void setCollection(Set collection) { + this.collection = collection; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetRefCollEntity)) return false; + + SetRefCollEntity that = (SetRefCollEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetRefEdEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Added: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java 2008-08-21 11:18:53 UTC (rev 117) @@ -0,0 +1,123 @@ +package org.jboss.envers.test.integration.onetomany.unidirectional; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.unidirectional.SetRefCollEntity; +import org.jboss.envers.test.entities.StrTestEntity; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.Set; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedSet extends AbstractEntityTest { + private Integer str1_id; + private Integer str2_id; + + private Integer coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + StrTestEntity str1 = new StrTestEntity("str1"); + StrTestEntity str2 = new StrTestEntity("str2"); + + SetRefCollEntity coll1 = new SetRefCollEntity(3, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new HashSet()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(StrTestEntity.class, str2.getId()); + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(StrTestEntity.class, str1.getId()); + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + + // + + str1_id = str1.getId(); + str2_id = str2.getId(); + + coll1_id = coll1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(SetRefCollEntity.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id)); + } + + @SuppressWarnings({"ManualArrayToCollectionCopy"}) + private Set makeSet(T... objects) { + Set ret = new HashSet(); + for (T obj : objects) { ret.add(obj); } + return ret; + } + + @Test + public void testHistoryOfColl1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + StrTestEntity str2 = getEntityManager().find(StrTestEntity.class, str2_id); + + SetRefCollEntity rev1 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 1); + SetRefCollEntity rev2 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 2); + SetRefCollEntity rev3 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 3); + SetRefCollEntity rev4 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 4); + + assert rev1.getCollection().equals(makeSet(str1)); + assert rev2.getCollection().equals(makeSet(str1, str2)); + assert rev3.getCollection().equals(makeSet(str2)); + assert rev4.getCollection().equals(makeSet()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + + } +} Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-21 11:18:53 UTC (rev 117) @@ -15,6 +15,7 @@ public class WorkingEntity1 { @Id @GeneratedValue + @Column(name = "id1") private Integer id1; @Versioned Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-21 10:19:09 UTC (rev 116) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-21 11:18:53 UTC (rev 117) @@ -22,7 +22,7 @@ private String str2; @Versioned - @OneToMany //(mappedBy="we2") + @OneToMany //(mappedBy="we2") //@ManyToMany //@Transient private Set we1s; From jboss-envers-commits at lists.jboss.org Thu Aug 21 07:30:55 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 21 Aug 2008 07:30:55 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r118 - in trunk/src/test/org/jboss/envers/test: integration/onetomany and 2 other directories. Message-ID: Author: adamw Date: 2008-08-21 07:30:54 -0400 (Thu, 21 Aug 2008) New Revision: 118 Added: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ListRefCollEntity.java trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedList.java trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/DataChangesNotOwnedSet.java Modified: trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicList.java trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicSet.java trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java trunk/src/test/org/jboss/envers/test/tools/TestTools.java Log: ENVERS-26: more tests Copied: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ListRefCollEntity.java (from rev 117, trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/SetRefCollEntity.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ListRefCollEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ListRefCollEntity.java 2008-08-21 11:30:54 UTC (rev 118) @@ -0,0 +1,85 @@ +package org.jboss.envers.test.entities.onetomany.unidirectional; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.StrTestEntity; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import java.util.List; + +/** + * Set collection of references entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class ListRefCollEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @OneToMany + private List collection; + + public ListRefCollEntity() { + } + + public ListRefCollEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public ListRefCollEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public List getCollection() { + return collection; + } + + public void setCollection(List collection) { + this.collection = collection; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ListRefCollEntity)) return false; + + ListRefCollEntity that = (ListRefCollEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetRefEdEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ListRefCollEntity.java ___________________________________________________________________ Name: svn:mergeinfo + Modified: trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicList.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicList.java 2008-08-21 11:18:53 UTC (rev 117) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicList.java 2008-08-21 11:30:54 UTC (rev 118) @@ -3,6 +3,7 @@ import org.jboss.envers.test.integration.AbstractEntityTest; import org.jboss.envers.test.entities.onetomany.ListRefEdEntity; import org.jboss.envers.test.entities.onetomany.ListRefIngEntity; +import org.jboss.envers.test.tools.TestTools; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.hibernate.ejb.Ejb3Configuration; @@ -83,21 +84,6 @@ assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(ListRefIngEntity.class, ing1_id)); assert Arrays.asList(1, 3).equals(getVersionsReader().getRevisions(ListRefIngEntity.class, ing2_id)); } - - private boolean checkList(List list, T... objects) { - if (list.size() != objects.length) { - return false; - } - - for (T obj : objects) { - if (!list.contains(obj)) { - return false; - } - } - - return true; - } - @Test public void testHistoryOfEdId1() { ListRefIngEntity ing1 = getEntityManager().find(ListRefIngEntity.class, ing1_id); @@ -107,9 +93,9 @@ ListRefEdEntity rev2 = getVersionsReader().find(ListRefEdEntity.class, ed1_id, 2); ListRefEdEntity rev3 = getVersionsReader().find(ListRefEdEntity.class, ed1_id, 3); - assert checkList(rev1.getReffering(), ing1, ing2); - assert checkList(rev2.getReffering(), ing2); - assert checkList(rev3.getReffering()); + assert TestTools.checkList(rev1.getReffering(), ing1, ing2); + assert TestTools.checkList(rev2.getReffering(), ing2); + assert TestTools.checkList(rev3.getReffering()); } @Test @@ -121,9 +107,9 @@ ListRefEdEntity rev2 = getVersionsReader().find(ListRefEdEntity.class, ed2_id, 2); ListRefEdEntity rev3 = getVersionsReader().find(ListRefEdEntity.class, ed2_id, 3); - assert checkList(rev1.getReffering()); - assert checkList(rev2.getReffering(), ing1); - assert checkList(rev3.getReffering(), ing1, ing2); + assert TestTools.checkList(rev1.getReffering()); + assert TestTools.checkList(rev2.getReffering(), ing1); + assert TestTools.checkList(rev3.getReffering(), ing1, ing2); } @Test Modified: trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicSet.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicSet.java 2008-08-21 11:18:53 UTC (rev 117) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicSet.java 2008-08-21 11:30:54 UTC (rev 118) @@ -3,14 +3,13 @@ import org.jboss.envers.test.integration.AbstractEntityTest; import org.jboss.envers.test.entities.onetomany.SetRefEdEntity; import org.jboss.envers.test.entities.onetomany.SetRefIngEntity; +import org.jboss.envers.test.tools.TestTools; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.hibernate.ejb.Ejb3Configuration; import javax.persistence.EntityManager; import java.util.Arrays; -import java.util.Set; -import java.util.HashSet; import java.util.Collections; /** @@ -98,13 +97,6 @@ assert Arrays.asList(2, 4).equals(getVersionsReader().getRevisions(SetRefIngEntity.class, ing2_id)); } - private Set makeSet(T... objects) { - Set ret = new HashSet(); - //noinspection ManualArrayToCollectionCopy - for (T obj : objects) { ret.add(obj); } - return ret; - } - @Test public void testHistoryOfEdId1() { SetRefIngEntity ing1 = getEntityManager().find(SetRefIngEntity.class, ing1_id); @@ -116,8 +108,8 @@ SetRefEdEntity rev4 = getVersionsReader().find(SetRefEdEntity.class, ed1_id, 4); assert rev1.getReffering().equals(Collections.EMPTY_SET); - assert rev2.getReffering().equals(makeSet(ing1, ing2)); - assert rev3.getReffering().equals(makeSet(ing2)); + assert rev2.getReffering().equals(TestTools.makeSet(ing1, ing2)); + assert rev3.getReffering().equals(TestTools.makeSet(ing2)); assert rev4.getReffering().equals(Collections.EMPTY_SET); } @@ -133,8 +125,8 @@ assert rev1.getReffering().equals(Collections.EMPTY_SET); assert rev2.getReffering().equals(Collections.EMPTY_SET); - assert rev3.getReffering().equals(makeSet(ing1)); - assert rev4.getReffering().equals(makeSet(ing1, ing2)); + assert rev3.getReffering().equals(TestTools.makeSet(ing1)); + assert rev4.getReffering().equals(TestTools.makeSet(ing1, ing2)); } @Test Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedList.java (from rev 117, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedList.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedList.java 2008-08-21 11:30:54 UTC (rev 118) @@ -0,0 +1,115 @@ +package org.jboss.envers.test.integration.onetomany.unidirectional; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.unidirectional.ListRefCollEntity; +import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.ArrayList; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedList extends AbstractEntityTest { + private Integer str1_id; + private Integer str2_id; + + private Integer coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrTestEntity.class); + cfg.addAnnotatedClass(ListRefCollEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + StrTestEntity str1 = new StrTestEntity("str1"); + StrTestEntity str2 = new StrTestEntity("str2"); + + ListRefCollEntity coll1 = new ListRefCollEntity(3, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new ArrayList()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(StrTestEntity.class, str2.getId()); + coll1 = em.find(ListRefCollEntity.class, coll1.getId()); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(StrTestEntity.class, str1.getId()); + coll1 = em.find(ListRefCollEntity.class, coll1.getId()); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(ListRefCollEntity.class, coll1.getId()); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + + // + + str1_id = str1.getId(); + str2_id = str2.getId(); + + coll1_id = coll1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(ListRefCollEntity.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + StrTestEntity str2 = getEntityManager().find(StrTestEntity.class, str2_id); + + ListRefCollEntity rev1 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 1); + ListRefCollEntity rev2 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 2); + ListRefCollEntity rev3 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 3); + ListRefCollEntity rev4 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 4); + + assert TestTools.checkList(rev1.getCollection(), str1); + assert TestTools.checkList(rev2.getCollection(), str1, str2); + assert TestTools.checkList(rev3.getCollection(), str2); + assert TestTools.checkList(rev4.getCollection()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedList.java ___________________________________________________________________ Name: svn:mergeinfo + Modified: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java 2008-08-21 11:18:53 UTC (rev 117) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java 2008-08-21 11:30:54 UTC (rev 118) @@ -3,13 +3,13 @@ import org.jboss.envers.test.integration.AbstractEntityTest; import org.jboss.envers.test.entities.onetomany.unidirectional.SetRefCollEntity; import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; import org.hibernate.ejb.Ejb3Configuration; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import javax.persistence.EntityManager; import java.util.Arrays; -import java.util.Set; import java.util.HashSet; /** @@ -92,13 +92,6 @@ assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id)); } - @SuppressWarnings({"ManualArrayToCollectionCopy"}) - private Set makeSet(T... objects) { - Set ret = new HashSet(); - for (T obj : objects) { ret.add(obj); } - return ret; - } - @Test public void testHistoryOfColl1() { StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); @@ -109,15 +102,14 @@ SetRefCollEntity rev3 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 3); SetRefCollEntity rev4 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 4); - assert rev1.getCollection().equals(makeSet(str1)); - assert rev2.getCollection().equals(makeSet(str1, str2)); - assert rev3.getCollection().equals(makeSet(str2)); - assert rev4.getCollection().equals(makeSet()); + assert rev1.getCollection().equals(TestTools.makeSet(str1)); + assert rev2.getCollection().equals(TestTools.makeSet(str1, str2)); + assert rev3.getCollection().equals(TestTools.makeSet(str2)); + assert rev4.getCollection().equals(TestTools.makeSet()); assert "coll1".equals(rev1.getData()); assert "coll1".equals(rev2.getData()); assert "coll1".equals(rev3.getData()); assert "coll1".equals(rev4.getData()); - } } Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/DataChangesNotOwnedSet.java (from rev 117, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/DataChangesNotOwnedSet.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/DataChangesNotOwnedSet.java 2008-08-21 11:30:54 UTC (rev 118) @@ -0,0 +1,84 @@ +package org.jboss.envers.test.integration.onetomany.unidirectional; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.unidirectional.SetRefCollEntity; +import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DataChangesNotOwnedSet extends AbstractEntityTest { + private Integer str1_id; + + private Integer coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + StrTestEntity str1 = new StrTestEntity("str1"); + + SetRefCollEntity coll1 = new SetRefCollEntity(3, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + + coll1.setCollection(new HashSet()); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str1 = em.find(StrTestEntity.class, str1.getId()); + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().add(str1); + coll1.setData("coll2"); + + em.getTransaction().commit(); + + // + + str1_id = str1.getId(); + + coll1_id = coll1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(SetRefCollEntity.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + } + + @Test + public void testHistoryOfColl1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + + SetRefCollEntity rev1 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 1); + SetRefCollEntity rev2 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 2); + + assert rev1.getCollection().equals(TestTools.makeSet()); + assert rev2.getCollection().equals(TestTools.makeSet(str1)); + + assert "coll1".equals(rev1.getData()); + assert "coll2".equals(rev2.getData()); + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/DataChangesNotOwnedSet.java ___________________________________________________________________ Name: svn:mergeinfo + Modified: trunk/src/test/org/jboss/envers/test/tools/TestTools.java =================================================================== --- trunk/src/test/org/jboss/envers/test/tools/TestTools.java 2008-08-21 11:18:53 UTC (rev 117) +++ trunk/src/test/org/jboss/envers/test/tools/TestTools.java 2008-08-21 11:30:54 UTC (rev 118) @@ -2,6 +2,7 @@ import java.util.Set; import java.util.HashSet; +import java.util.List; /** * @author Adam Warski (adam at warski dot org) @@ -16,4 +17,18 @@ return ret; } + + public static boolean checkList(List list, T... objects) { + if (list.size() != objects.length) { + return false; + } + + for (T obj : objects) { + if (!list.contains(obj)) { + return false; + } + } + + return true; + } } From jboss-envers-commits at lists.jboss.org Thu Aug 21 09:56:27 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 21 Aug 2008 09:56:27 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r119 - in trunk/src: main/org/jboss/envers/entities/mapper/id and 3 other directories. Message-ID: Author: adamw Date: 2008-08-21 09:56:27 -0400 (Thu, 21 Aug 2008) New Revision: 119 Added: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/ trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityEmbId.java trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityMulId.java trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithEmbId.java trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithMulId.java Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractCompositeIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/EmbeddedIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/MultipleIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/id/SingleIdMapper.java Log: ENVERS-26: tests + bug fix Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-21 11:30:54 UTC (rev 118) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-21 13:56:27 UTC (rev 119) @@ -71,11 +71,11 @@ try { cfg.addDocument(writer.write(mappingData.getMainMapping())); - writeDocument(mappingData.getMainMapping()); + //writeDocument(mappingData.getMainMapping()); for (Document additionalMapping : mappingData.getAdditionalMappings()) { cfg.addDocument(writer.write(additionalMapping)); - writeDocument(additionalMapping); + //writeDocument(additionalMapping); } } catch (DocumentException e) { throw new MappingException(e); Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractCompositeIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractCompositeIdMapper.java 2008-08-21 11:30:54 UTC (rev 118) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractCompositeIdMapper.java 2008-08-21 13:56:27 UTC (rev 119) @@ -25,7 +25,7 @@ import org.jboss.envers.exception.VersionsException; import java.util.Map; -import java.util.HashMap; +import java.util.LinkedHashMap; /** * @author Adam Warski (adam at warski dot org) @@ -35,7 +35,7 @@ protected String compositeIdClass; protected AbstractCompositeIdMapper(String compositeIdClass) { - ids = new HashMap(); + ids = new LinkedHashMap(); this.compositeIdClass = compositeIdClass; } Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java 2008-08-21 11:30:54 UTC (rev 118) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/AbstractIdMapper.java 2008-08-21 13:56:27 UTC (rev 119) @@ -25,15 +25,15 @@ import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Conjunction; -import java.util.Set; import java.util.Iterator; +import java.util.List; /** * @author Adam Warski (adam at warski dot org) */ public abstract class AbstractIdMapper implements IdMapper { public Criterion getIdsEqualCriterion(String prefix1, String prefix2) { - Set paramDatas = mapToQueryParametersFromId(null); + List paramDatas = mapToQueryParametersFromId(null); if (paramDatas.size() == 1) { QueryParameterData paramData = paramDatas.iterator().next(); @@ -52,7 +52,7 @@ } public String getIdsEqualQuery(String prefix1, String prefix2) { - Set paramDatas = mapToQueryParametersFromId(null); + List paramDatas = mapToQueryParametersFromId(null); StringBuilder query = new StringBuilder(); @@ -70,8 +70,8 @@ } public String getIdsEqualQuery(String prefix1, IdMapper mapper2, String prefix2) { - Set paramDatas1 = mapToQueryParametersFromId(null); - Set paramDatas2 = mapper2.mapToQueryParametersFromId(null); + List paramDatas1 = mapToQueryParametersFromId(null); + List paramDatas2 = mapper2.mapToQueryParametersFromId(null); StringBuilder query = new StringBuilder(); @@ -91,7 +91,7 @@ } public String getIdEqualsQuery(String prefix, boolean equals) { - Set paramDatas = mapToQueryParametersFromId(null); + List paramDatas = mapToQueryParametersFromId(null); StringBuilder query = new StringBuilder(); @@ -117,7 +117,7 @@ } public Criterion getIdEqualsCriterion(Object id, String prefix, boolean equals) { - Set paramDatas = mapToQueryParametersFromId(id); + List paramDatas = mapToQueryParametersFromId(id); if (paramDatas.size() == 1) { QueryParameterData paramData = paramDatas.iterator().next(); Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/EmbeddedIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/EmbeddedIdMapper.java 2008-08-21 11:30:54 UTC (rev 118) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/EmbeddedIdMapper.java 2008-08-21 13:56:27 UTC (rev 119) @@ -27,10 +27,7 @@ import org.jboss.envers.exception.VersionsException; import org.jboss.envers.tools.reflection.ReflectionTools; -import java.util.Map; -import java.util.Set; -import java.util.HashMap; -import java.util.HashSet; +import java.util.*; /** * @author Adam Warski (adam at warski dot org) @@ -98,11 +95,11 @@ return getter.get(data); } - public Set mapToQueryParametersFromId(Object obj) { - Map data = new HashMap(); + public List mapToQueryParametersFromId(Object obj) { + Map data = new LinkedHashMap(); mapToMapFromId(data, obj); - Set ret = new HashSet(); + List ret = new ArrayList(); for (String propertyName : data.keySet()) { ret.add(new QueryParameterData(propertyName, data.get(propertyName))); Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java 2008-08-21 11:30:54 UTC (rev 118) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/IdMapper.java 2008-08-21 13:56:27 UTC (rev 119) @@ -24,13 +24,12 @@ import org.hibernate.criterion.Criterion; import java.util.Map; -import java.util.Set; +import java.util.List; /** * @author Adam Warski (adam at warski dot org) */ public interface IdMapper { - public void mapToMapFromId(Map data, Object obj); public void mapToMapFromEntity(Map data, Object obj); @@ -53,7 +52,7 @@ * @param obj Id from which to map. * @return A set parameter data, needed to build a query basing on the given id. */ - public Set mapToQueryParametersFromId(Object obj); + public List mapToQueryParametersFromId(Object obj); /** * Gets a criteria object, which contains restrictions, which express the property that the id of the entity Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/MultipleIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/MultipleIdMapper.java 2008-08-21 11:30:54 UTC (rev 118) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/MultipleIdMapper.java 2008-08-21 13:56:27 UTC (rev 119) @@ -23,10 +23,7 @@ import org.jboss.envers.exception.VersionsException; -import java.util.Map; -import java.util.Set; -import java.util.HashMap; -import java.util.HashSet; +import java.util.*; /** * @author Adam Warski (adam at warski dot org) @@ -81,11 +78,11 @@ return ret; } - public Set mapToQueryParametersFromId(Object obj) { - Map data = new HashMap(); + public List mapToQueryParametersFromId(Object obj) { + Map data = new LinkedHashMap(); mapToMapFromId(data, obj); - Set ret = new HashSet(); + List ret = new ArrayList(); for (String propertyName : data.keySet()) { ret.add(new QueryParameterData(propertyName, data.get(propertyName))); Modified: trunk/src/main/org/jboss/envers/entities/mapper/id/SingleIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/id/SingleIdMapper.java 2008-08-21 11:30:54 UTC (rev 118) +++ trunk/src/main/org/jboss/envers/entities/mapper/id/SingleIdMapper.java 2008-08-21 13:56:27 UTC (rev 119) @@ -27,9 +27,7 @@ import org.hibernate.property.Setter; import org.hibernate.property.Getter; -import java.util.Map; -import java.util.Set; -import java.util.HashSet; +import java.util.*; /** * @author Adam Warski (adam at warski dot org) @@ -115,8 +113,8 @@ return new SingleIdMapper(propertyName, prefix + propertyName); } - public Set mapToQueryParametersFromId(Object obj) { - Set ret = new HashSet(); + public List mapToQueryParametersFromId(Object obj) { + List ret = new ArrayList(); ret.add(new QueryParameterData(propertyName, obj)); Copied: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityEmbId.java (from rev 117, trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/SetRefCollEntity.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityEmbId.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityEmbId.java 2008-08-21 13:56:27 UTC (rev 119) @@ -0,0 +1,86 @@ +package org.jboss.envers.test.entities.onetomany.unidirectional.ids; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.ids.EmbId; +import org.jboss.envers.test.entities.ids.EmbIdTestEntity; + +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import javax.persistence.EmbeddedId; +import java.util.Set; + +/** + * Set collection of references entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class SetRefCollEntityEmbId { + @EmbeddedId + private EmbId id; + + @Versioned + private String data; + + @Versioned + @OneToMany + private Set collection; + + public SetRefCollEntityEmbId() { + } + + public SetRefCollEntityEmbId(EmbId id, String data) { + this.id = id; + this.data = data; + } + + public SetRefCollEntityEmbId(String data) { + this.data = data; + } + + public EmbId getId() { + return id; + } + + public void setId(EmbId id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getCollection() { + return collection; + } + + public void setCollection(Set collection) { + this.collection = collection; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetRefCollEntityEmbId)) return false; + + SetRefCollEntityEmbId that = (SetRefCollEntityEmbId) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetRefCollEntityEmbId(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityEmbId.java ___________________________________________________________________ Name: svn:mergeinfo + Added: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityMulId.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityMulId.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityMulId.java 2008-08-21 13:56:27 UTC (rev 119) @@ -0,0 +1,99 @@ +package org.jboss.envers.test.entities.onetomany.unidirectional.ids; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.ids.MulIdTestEntity; +import org.jboss.envers.test.entities.ids.MulId; + +import javax.persistence.*; +import java.util.Set; + +/** + * Set collection of references entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity + at IdClass(MulId.class) +public class SetRefCollEntityMulId { + @Id + private Integer id1; + + @Id + private Integer id2; + + @Versioned + private String data; + + @Versioned + @OneToMany + private Set collection; + + public SetRefCollEntityMulId() { + } + + public SetRefCollEntityMulId(Integer id1, Integer id2, String data) { + this.id1 = id1; + this.id2 = id2; + this.data = data; + } + + public SetRefCollEntityMulId(String data) { + this.data = data; + } + + public Integer getId1() { + return id1; + } + + public void setId1(Integer id1) { + this.id1 = id1; + } + + public Integer getId2() { + return id2; + } + + public void setId2(Integer id2) { + this.id2 = id2; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getCollection() { + return collection; + } + + public void setCollection(Set collection) { + this.collection = collection; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetRefCollEntityMulId)) return false; + + SetRefCollEntityMulId that = (SetRefCollEntityMulId) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id1 != null ? !id1.equals(that.id1) : that.id1 != null) return false; + if (id2 != null ? !id2.equals(that.id2) : that.id2 != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id1 != null ? id1.hashCode() : 0); + result = 31 * result + (id2 != null ? id2.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetRefCollEntityMulId(id1 = " + id1 + ", id2 = " + id2 + ", data = " + data + ")"; + } +} \ No newline at end of file Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithEmbId.java (from rev 118, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithEmbId.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithEmbId.java 2008-08-21 13:56:27 UTC (rev 119) @@ -0,0 +1,114 @@ +package org.jboss.envers.test.integration.onetomany.unidirectional; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.unidirectional.ids.SetRefCollEntityEmbId; +import org.jboss.envers.test.entities.ids.EmbIdTestEntity; +import org.jboss.envers.test.entities.ids.EmbId; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedSetWithEmbId extends AbstractEntityTest { + private EmbId str1_id; + private EmbId str2_id; + + private EmbId coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(EmbIdTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntityEmbId.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + str1_id = new EmbId(1, 2); + str2_id = new EmbId(3, 4); + + coll1_id = new EmbId(5, 6); + + EmbIdTestEntity str1 = new EmbIdTestEntity(str1_id, "str1"); + EmbIdTestEntity str2 = new EmbIdTestEntity(str2_id, "str2"); + + SetRefCollEntityEmbId coll1 = new SetRefCollEntityEmbId(coll1_id, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new HashSet()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(EmbIdTestEntity.class, str2.getId()); + coll1 = em.find(SetRefCollEntityEmbId.class, coll1.getId()); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(EmbIdTestEntity.class, str1.getId()); + coll1 = em.find(SetRefCollEntityEmbId.class, coll1.getId()); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(SetRefCollEntityEmbId.class, coll1.getId()); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(SetRefCollEntityEmbId.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(EmbIdTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(EmbIdTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + EmbIdTestEntity str1 = getEntityManager().find(EmbIdTestEntity.class, str1_id); + EmbIdTestEntity str2 = getEntityManager().find(EmbIdTestEntity.class, str2_id); + + SetRefCollEntityEmbId rev1 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 1); + SetRefCollEntityEmbId rev2 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 2); + SetRefCollEntityEmbId rev3 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 3); + SetRefCollEntityEmbId rev4 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 4); + + assert rev1.getCollection().equals(TestTools.makeSet(str1)); + assert rev2.getCollection().equals(TestTools.makeSet(str1, str2)); + assert rev3.getCollection().equals(TestTools.makeSet(str2)); + assert rev4.getCollection().equals(TestTools.makeSet()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithEmbId.java ___________________________________________________________________ Name: svn:mergeinfo + Added: trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithMulId.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithMulId.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithMulId.java 2008-08-21 13:56:27 UTC (rev 119) @@ -0,0 +1,114 @@ +package org.jboss.envers.test.integration.onetomany.unidirectional; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.unidirectional.ids.SetRefCollEntityMulId; +import org.jboss.envers.test.entities.ids.MulIdTestEntity; +import org.jboss.envers.test.entities.ids.MulId; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedSetWithMulId extends AbstractEntityTest { + private MulId str1_id; + private MulId str2_id; + + private MulId coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(MulIdTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntityMulId.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + str1_id = new MulId(1, 2); + str2_id = new MulId(3, 4); + + coll1_id = new MulId(5, 6); + + MulIdTestEntity str1 = new MulIdTestEntity(str1_id.getId1(), str1_id.getId2(), "str1"); + MulIdTestEntity str2 = new MulIdTestEntity(str2_id.getId1(), str2_id.getId2(), "str2"); + + SetRefCollEntityMulId coll1 = new SetRefCollEntityMulId(coll1_id.getId1(), coll1_id.getId2(), "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new HashSet()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(MulIdTestEntity.class, str2_id); + coll1 = em.find(SetRefCollEntityMulId.class, coll1_id); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(MulIdTestEntity.class, str1_id); + coll1 = em.find(SetRefCollEntityMulId.class, coll1_id); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(SetRefCollEntityMulId.class, coll1_id); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(SetRefCollEntityMulId.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(MulIdTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(MulIdTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + MulIdTestEntity str1 = getEntityManager().find(MulIdTestEntity.class, str1_id); + MulIdTestEntity str2 = getEntityManager().find(MulIdTestEntity.class, str2_id); + + SetRefCollEntityMulId rev1 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 1); + SetRefCollEntityMulId rev2 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 2); + SetRefCollEntityMulId rev3 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 3); + SetRefCollEntityMulId rev4 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 4); + + assert rev1.getCollection().equals(TestTools.makeSet(str1)); + assert rev2.getCollection().equals(TestTools.makeSet(str1, str2)); + assert rev3.getCollection().equals(TestTools.makeSet(str2)); + assert rev4.getCollection().equals(TestTools.makeSet()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + } +} \ No newline at end of file From jboss-envers-commits at lists.jboss.org Thu Aug 21 10:45:59 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Thu, 21 Aug 2008 10:45:59 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r120 - in trunk: src/main/org/jboss/envers/configuration and 1 other directories. Message-ID: Author: adamw Date: 2008-08-21 10:45:59 -0400 (Thu, 21 Aug 2008) New Revision: 120 Added: trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java Modified: trunk/resources/test/testng.xml trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java Log: ENVERS-26: tests Modified: trunk/resources/test/testng.xml =================================================================== --- trunk/resources/test/testng.xml 2008-08-21 13:56:27 UTC (rev 119) +++ trunk/resources/test/testng.xml 2008-08-21 14:45:59 UTC (rev 120) @@ -9,10 +9,12 @@ + + Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-21 13:56:27 UTC (rev 119) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-21 14:45:59 UTC (rev 120) @@ -75,7 +75,7 @@ for (Document additionalMapping : mappingData.getAdditionalMappings()) { cfg.addDocument(writer.write(additionalMapping)); - //writeDocument(additionalMapping); + writeDocument(additionalMapping); } } catch (DocumentException e) { throw new MappingException(e); Added: trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-21 14:45:59 UTC (rev 120) @@ -0,0 +1,107 @@ +package org.jboss.envers.test.integration.naming; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.hibernate.mapping.Column; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.Iterator; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyUnidirectionalNaming extends AbstractEntityTest { + private Integer uni1_id; + private Integer str1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(UnidirectionalNamingTestEntity.class); + cfg.addAnnotatedClass(StrTestEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + UnidirectionalNamingTestEntity uni1 = new UnidirectionalNamingTestEntity(1, "data1"); + StrTestEntity str1 = new StrTestEntity("str1"); + + // Revision 1 + EntityManager em = getEntityManager(); + em.getTransaction().begin(); + + uni1.setCollection(new HashSet()); + em.persist(uni1); + em.persist(str1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + uni1 = em.find(UnidirectionalNamingTestEntity.class, uni1.getId()); + str1 = em.find(StrTestEntity.class, str1.getId()); + uni1.getCollection().add(str1); + + em.getTransaction().commit(); + + // + + uni1_id = uni1.getId(); + str1_id = str1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(UnidirectionalNamingTestEntity.class, uni1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + } + + @Test + public void testHistoryOfUniId1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + + UnidirectionalNamingTestEntity rev1 = getVersionsReader().find(UnidirectionalNamingTestEntity.class, uni1_id, 1); + UnidirectionalNamingTestEntity rev2 = getVersionsReader().find(UnidirectionalNamingTestEntity.class, uni1_id, 2); + + assert rev1.getCollection().equals(TestTools.makeSet()); + assert rev2.getCollection().equals(TestTools.makeSet(str1)); + + assert "data1".equals(rev1.getData()); + assert "data1".equals(rev2.getData()); + } + + @Test + public void testTableName() { + assert "UNI_NAMING_TEST_versions".equals( + getCfg().getClassMapping("UnidirectionalNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") + .getTable().getName()); + } + + @SuppressWarnings({"unchecked"}) + @Test + public void testJoinColumnName() { + Iterator columns = + getCfg().getClassMapping("UnidirectionalNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") + .getTable().getColumnIterator(); + + boolean id1Found = false; + boolean id2Found = false; + + while (columns.hasNext()) { + if ("ID_1".equals(columns.next().getName())) { + id1Found = true; + } + + if ("ID_2".equals(columns.next().getName())) { + id2Found = true; + } + } + + assert id1Found && id2Found; + } +} Added: trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java 2008-08-21 14:45:59 UTC (rev 120) @@ -0,0 +1,85 @@ +package org.jboss.envers.test.integration.naming; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.StrTestEntity; + +import javax.persistence.*; +import java.util.Set; + +/** + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class UnidirectionalNamingTestEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @OneToMany + @JoinTable(name = "UNI_NAMING_TEST", + joinColumns = @JoinColumn(name = "ID_1"), + inverseJoinColumns = @JoinColumn(name = "ID_2")) + private Set collection; + + public UnidirectionalNamingTestEntity() { + } + + public UnidirectionalNamingTestEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public UnidirectionalNamingTestEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getCollection() { + return collection; + } + + public void setCollection(Set collection) { + this.collection = collection; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof UnidirectionalNamingTestEntity)) return false; + + UnidirectionalNamingTestEntity that = (UnidirectionalNamingTestEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "UnidirectionalNamingTestEntity(id = " + id + ", data = " + data + ")"; + } +} From jboss-envers-commits at lists.jboss.org Fri Aug 22 08:03:53 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Fri, 22 Aug 2008 08:03:53 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r121 - in trunk/src: main/org/jboss/envers/configuration/metadata and 3 other directories. Message-ID: Author: adamw Date: 2008-08-22 08:03:52 -0400 (Fri, 22 Aug 2008) New Revision: 121 Added: trunk/src/main/org/jboss/envers/Unversioned.java trunk/src/test/org/jboss/envers/test/entities/UnversionedEntity.java trunk/src/test/org/jboss/envers/test/integration/basic/UnversionedProperty.java Removed: trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java Modified: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java Log: ENVERS-39: unversioned properties, test Added: trunk/src/main/org/jboss/envers/Unversioned.java =================================================================== --- trunk/src/main/org/jboss/envers/Unversioned.java (rev 0) +++ trunk/src/main/org/jboss/envers/Unversioned.java 2008-08-22 12:03:52 UTC (rev 121) @@ -0,0 +1,37 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers; + +import java.lang.annotation.Target; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * When applied to a field, indicates that this field should not be versioned. + * @author Sebastian Komander + */ + at Retention(RetentionPolicy.RUNTIME) + at Target({ElementType.METHOD, ElementType.FIELD}) +public @interface Unversioned { + +} Modified: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-21 14:45:59 UTC (rev 120) +++ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-22 12:03:52 UTC (rev 121) @@ -24,40 +24,42 @@ import org.jboss.envers.tools.reflection.YClass; import org.jboss.envers.tools.reflection.YProperty; import org.jboss.envers.tools.reflection.YReflectionManager; -import org.jboss.envers.configuration.metadata.PersistentClassVersioningData; -import org.jboss.envers.Versioned; -import org.jboss.envers.VersionsTable; -import org.jboss.envers.SecondaryVersionsTable; -import org.jboss.envers.SecondaryVersionsTables; +import org.jboss.envers.*; import org.hibernate.mapping.PersistentClass; import org.hibernate.MappingException; /** * A helper class to read versioning meta-data from annotations on persistent classes. * @author Adam Warski (adam at warski dot org) + * @author Sebastian Komander */ public class AnnotationsMetadataReader { - private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData versioningData) { - YClass superclazz = clazz.getSuperclass(); - if (!"java.lang.Object".equals(superclazz.getName())) { - addPropertiesFromClass(superclazz, versioningData); - } - - for (YProperty property : clazz.getDeclaredProperties("field")) { + private void addFromProperties(Iterable properties, PersistentClassVersioningData versioningData) { + for (YProperty property : properties) { Versioned ver = property.getAnnotation(Versioned.class); if (ver != null) { versioningData.propertyStoreInfo.propertyStores.put(property.getName(), ver.modStore()); } - } - for (YProperty property : clazz.getDeclaredProperties("property")) { - Versioned ver = property.getAnnotation(Versioned.class); - if (ver != null) { - versioningData.propertyStoreInfo.propertyStores.put(property.getName(), ver.modStore()); + // check if a property is declared as unversioned to exclude it + // useful if a class is versioned but some properties should be excluded + Unversioned unVer = property.getAnnotation(Unversioned.class); + if (unVer != null) { + versioningData.unversionedProperties.add(property.getName()); } } } + private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData versioningData) { + YClass superclazz = clazz.getSuperclass(); + if (!"java.lang.Object".equals(superclazz.getName())) { + addPropertiesFromClass(superclazz, versioningData); + } + + addFromProperties(clazz.getDeclaredProperties("field"), versioningData); + addFromProperties(clazz.getDeclaredProperties("property"), versioningData); + } + public PersistentClassVersioningData getVersioningData(PersistentClass pc, YReflectionManager reflectionManager) { PersistentClassVersioningData versioningData = new PersistentClassVersioningData(); Modified: trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java 2008-08-21 14:45:59 UTC (rev 120) +++ trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java 2008-08-22 12:03:52 UTC (rev 121) @@ -25,14 +25,18 @@ import java.util.HashMap; import java.util.Map; +import java.util.List; +import java.util.ArrayList; /** * @author Adam Warski (adam at warski dot org) + * @author Sebastian Komander */ public class PersistentClassVersioningData { public PersistentClassVersioningData() { propertyStoreInfo = new PropertyStoreInfo(new HashMap()); secondaryTableDictionary = new HashMap(); + unversionedProperties = new ArrayList(); } public PropertyStoreInfo propertyStoreInfo; @@ -40,6 +44,7 @@ public String schema; public String catalog; public Map secondaryTableDictionary; + public List unversionedProperties; public boolean isVersioned() { if (propertyStoreInfo.propertyStores.size() > 0) { return true; } Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-21 14:45:59 UTC (rev 120) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-22 12:03:52 UTC (rev 121) @@ -53,6 +53,7 @@ /** * @author Adam Warski (adam at warski dot org) + * @author Sebastian Komander */ public class VersionsMetadataGenerator { private final static Map EMPTY_STORE = Collections.emptyMap(); @@ -139,7 +140,8 @@ @SuppressWarnings({"unchecked"}) private void addComponent(Element parent, Property property, CompositeMapperBuilder mapper, ModificationStore store, - String entityName, EntityMappingData mappingData, boolean firstPass) { + String entityName, EntityMappingData mappingData, List unversionedProperties, + boolean firstPass) { Element component_mapping = null; Component prop_component = (Component) property.getValue(); @@ -166,7 +168,7 @@ addProperties(component_mapping, (Iterator) prop_component.getPropertyIterator(), mapper.addComposite(property.getName()), new PropertyStoreInfo(store, EMPTY_STORE), entityName, - mappingData, firstPass); + mappingData, unversionedProperties, firstPass); } @SuppressWarnings({"unchecked"}) @@ -417,18 +419,20 @@ @SuppressWarnings({"unchecked"}) private void addProperties(Element parent, Iterator properties, CompositeMapperBuilder currentMapper, PropertyStoreInfo propertyStoreInfo, String entityName, EntityMappingData mappingData, - boolean firstPass) { + List unversionedProperties, boolean firstPass) { while (properties.hasNext()) { Property property = properties.next(); Type propertyType = property.getType(); if (!"_identifierMapper".equals(property.getName())) { ModificationStore store = getStoreForProperty(property, propertyStoreInfo); - if (store != null) { + // check if the store isn't empty and the property isn't unversioned + if (store != null && !unversionedProperties.contains(property.getName())) { if (propertyType instanceof ComponentType) { // only first pass if (firstPass) { - addComponent(parent, property, currentMapper, store, entityName, mappingData, firstPass); + addComponent(parent, property, currentMapper, store, entityName, mappingData, + unversionedProperties, firstPass); } } else if (propertyType instanceof ImmutableType || propertyType instanceof MutableType) { // only first pass @@ -529,7 +533,8 @@ @SuppressWarnings({"unchecked"}) private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PropertyStoreInfo propertyStoreInfo, - String entityName, EntityMappingData mappingData, boolean firstPass) { + String entityName, EntityMappingData mappingData, List unversionedProperties, + boolean firstPass) { Iterator joins = pc.getJoinIterator(); while (joins.hasNext()) { @@ -537,7 +542,7 @@ Element joinElement = entitiesJoins.get(entityName).get(join); addProperties(joinElement, join.getPropertyIterator(), currentMapper, propertyStoreInfo, entityName, - mappingData, firstPass); + mappingData, unversionedProperties, firstPass); } } @@ -668,11 +673,13 @@ // Mapping unjoined properties addProperties(class_mapping, (Iterator) pc.getUnjoinedPropertyIterator(), propertyMapper, - versioningData.propertyStoreInfo, pc.getEntityName(), mappingData, true); + versioningData.propertyStoreInfo, pc.getEntityName(), mappingData, versioningData.unversionedProperties, + true); // Creating and mapping joins (first pass) createJoins(pc, class_mapping, versioningData); - addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, pc.getEntityName(), mappingData, true); + addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, pc.getEntityName(), mappingData, + versioningData.unversionedProperties, true); // Storing the generated configuration EntityConfiguration entityCfg = new EntityConfiguration(entityName, versionsEntityName, idMapper, @@ -694,10 +701,12 @@ } addProperties(parent, (Iterator) pc.getUnjoinedPropertyIterator(), - propertyMapper, versioningData.propertyStoreInfo, entityName, mappingData, false); + propertyMapper, versioningData.propertyStoreInfo, entityName, mappingData, + versioningData.unversionedProperties, false); // Mapping joins (second pass) - addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName, mappingData, false); + addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName, mappingData, + versioningData.unversionedProperties, false); } public Map getEntitiesConfigurations() { Deleted: trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java 2008-08-21 14:45:59 UTC (rev 120) +++ trunk/src/main/org/jboss/envers/synchronization/work/BidirectionalCollectionChangeWorkUnit.java 2008-08-22 12:03:52 UTC (rev 121) @@ -1,78 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.synchronization.work; - -import org.hibernate.Session; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.RevisionType; - -import java.io.Serializable; -import java.util.Map; -import java.util.HashMap; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class BidirectionalCollectionChangeWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { - private final Object entity; - - public BidirectionalCollectionChangeWorkUnit(String entityName, VersionsConfiguration verCfg, Serializable id, Object entity) { - super(entityName, verCfg, id); - - this.entity = entity; - } - - public boolean containsWork() { - return true; - } - - public void perform(Session session, Number revision) { - Map data = new HashMap(); - fillDataWithId(data, revision, RevisionType.MOD); - - verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().mapToMapFromEntity(data, entity, null); - - session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); - - setPerformed(data); - } - - public KeepCheckResult check(AddWorkUnit second) { - return KeepCheckResult.SECOND; - } - - public KeepCheckResult check(ModWorkUnit second) { - return KeepCheckResult.SECOND; - } - - public KeepCheckResult check(DelWorkUnit second) { - return KeepCheckResult.SECOND; - } - - public KeepCheckResult check(BidirectionalCollectionChangeWorkUnit second) { - return KeepCheckResult.FIRST; - } - - public KeepCheckResult dispatch(KeepCheckVisitor first) { - return first.check(this); - } -} Added: trunk/src/test/org/jboss/envers/test/entities/UnversionedEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/UnversionedEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/UnversionedEntity.java 2008-08-22 12:03:52 UTC (rev 121) @@ -0,0 +1,86 @@ +package org.jboss.envers.test.entities; + +import org.jboss.envers.Versioned; +import org.jboss.envers.Unversioned; + +import javax.persistence.Id; +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; + +/** + * @author Adam Warski (adam at warski dot org) + */ + at Entity + at Versioned +public class UnversionedEntity { + @Id + @GeneratedValue + private Integer id; + + @Basic + private String data1; + + @Basic + @Unversioned + private String data2; + + public UnversionedEntity() { + } + + public UnversionedEntity(String data1, String data2) { + this.data1 = data1; + this.data2 = data2; + } + + public UnversionedEntity(Integer id, String data1, String data2) { + this.id = id; + this.data1 = data1; + this.data2 = data2; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData1() { + return data1; + } + + public void setData1(String data1) { + this.data1 = data1; + } + + public String getData2() { + return data2; + } + + public void setData2(String data2) { + this.data2 = data2; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof UnversionedEntity)) return false; + + UnversionedEntity that = (UnversionedEntity) o; + + if (data1 != null ? !data1.equals(that.data1) : that.data1 != null) return false; + if (data2 != null ? !data2.equals(that.data2) : that.data2 != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data1 != null ? data1.hashCode() : 0); + result = 31 * result + (data2 != null ? data2.hashCode() : 0); + return result; + } +} Added: trunk/src/test/org/jboss/envers/test/integration/basic/UnversionedProperty.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/basic/UnversionedProperty.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/basic/UnversionedProperty.java 2008-08-22 12:03:52 UTC (rev 121) @@ -0,0 +1,54 @@ +package org.jboss.envers.test.integration.basic; + +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.jboss.envers.test.entities.UnversionedEntity; +import org.jboss.envers.test.integration.AbstractEntityTest; + +import javax.persistence.EntityManager; +import java.util.Arrays; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class UnversionedProperty extends AbstractEntityTest { + private Integer id1; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(UnversionedEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + // Rev 1 + em.getTransaction().begin(); + UnversionedEntity ue1 = new UnversionedEntity("a1", "b1"); + em.persist(ue1); + id1 = ue1.getId(); + em.getTransaction().commit(); + + // Rev 2 + em.getTransaction().begin(); + ue1 = em.find(UnversionedEntity.class, id1); + ue1.setData1("a2"); + ue1.setData2("b2"); + em.getTransaction().commit(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(UnversionedEntity.class, id1)); + } + + @Test + public void testHistoryOfId1() { + UnversionedEntity rev1 = new UnversionedEntity(id1, "a1", null); + UnversionedEntity rev2 = new UnversionedEntity(id1, "a2", null); + + assert getVersionsReader().find(UnversionedEntity.class, id1, 1).equals(rev1); + assert getVersionsReader().find(UnversionedEntity.class, id1, 2).equals(rev2); + } +} From jboss-envers-commits at lists.jboss.org Fri Aug 22 08:19:38 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Fri, 22 Aug 2008 08:19:38 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r122 - trunk/src/main/org/jboss/envers/configuration/metadata. Message-ID: Author: adamw Date: 2008-08-22 08:19:38 -0400 (Fri, 22 Aug 2008) New Revision: 122 Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java Log: ENVERS-39: checking if a property is versioned in one place Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-22 12:03:52 UTC (rev 121) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-22 12:19:38 UTC (rev 122) @@ -385,13 +385,19 @@ // TODO: ??? } - private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo) { + private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo, + List unversionedProperties) { /* * Checks if a property is versioned, which is when: + * - the property isn't unversioned * - the whole entity is versioned, then the default store is not null * - there is a store defined for this entity, which is when this property is annotated */ + if (unversionedProperties.contains(property.getName())) { + return null; + } + ModificationStore store = propertyStoreInfo.propertyStores.get(property.getName()); if (store == null) { @@ -424,10 +430,9 @@ Property property = properties.next(); Type propertyType = property.getType(); if (!"_identifierMapper".equals(property.getName())) { - ModificationStore store = getStoreForProperty(property, propertyStoreInfo); + ModificationStore store = getStoreForProperty(property, propertyStoreInfo, unversionedProperties); - // check if the store isn't empty and the property isn't unversioned - if (store != null && !unversionedProperties.contains(property.getName())) { + if (store != null) { if (propertyType instanceof ComponentType) { // only first pass if (firstPass) { From jboss-envers-commits at lists.jboss.org Fri Aug 22 11:22:20 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Fri, 22 Aug 2008 11:22:20 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r123 - in trunk/src/test/org/jboss/envers/test: entities/manytomany and 5 other directories. Message-ID: Author: adamw Date: 2008-08-22 11:22:20 -0400 (Fri, 22 Aug 2008) New Revision: 123 Added: trunk/src/test/org/jboss/envers/test/entities/manytomany/ trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwningEntity.java trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwningEntity.java trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwnedUniEntity.java trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwningUniEntity.java trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwnedUniEntity.java trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwningUniEntity.java trunk/src/test/org/jboss/envers/test/integration/manytomany/ trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/ trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniList.java trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniSet.java Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java Log: ENVERS-24: tests for many-to-many relations Added: trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,84 @@ +package org.jboss.envers.test.entities.manytomany; + +import org.jboss.envers.Versioned; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import java.util.List; + +/** + * Many-to-many not-owning entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class ListOwnedEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @ManyToMany(mappedBy="referencing") + private List referencing; + + public ListOwnedEntity() { + } + + public ListOwnedEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public ListOwnedEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public List getReferencing() { + return referencing; + } + + public void setReferencing(List referencing) { + this.referencing = referencing; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ListOwnedEntity)) return false; + + ListOwnedEntity that = (ListOwnedEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwnedEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Added: trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwningEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwningEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwningEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,81 @@ +package org.jboss.envers.test.entities.manytomany; + +import org.jboss.envers.Versioned; + +import javax.persistence.*; +import java.util.List; + +/** + * Entity owning the many-to-many relation + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class ListOwningEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @ManyToMany + private List references; + + public ListOwningEntity() { } + + public ListOwningEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public ListOwningEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public List getReferences() { + return references; + } + + public void setReferences(List references) { + this.references = references; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ListOwningEntity)) return false; + + ListOwningEntity that = (ListOwningEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwningEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Copied: trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java (from rev 112, trunk/src/test/org/jboss/envers/test/entities/onetomany/SetRefEdEntity.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,84 @@ +package org.jboss.envers.test.entities.manytomany; + +import org.jboss.envers.Versioned; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import java.util.Set; + +/** + * Many-to-many not-owning entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class SetOwnedEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @ManyToMany(mappedBy="referencing") + private Set referencing; + + public SetOwnedEntity() { + } + + public SetOwnedEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public SetOwnedEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getReferencing() { + return referencing; + } + + public void setReferencing(Set referencing) { + this.referencing = referencing; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetOwnedEntity)) return false; + + SetOwnedEntity that = (SetOwnedEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwnedEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java ___________________________________________________________________ Name: svn:mergeinfo + Copied: trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwningEntity.java (from rev 112, trunk/src/test/org/jboss/envers/test/entities/onetomany/SetRefIngEntity.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwningEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwningEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,81 @@ +package org.jboss.envers.test.entities.manytomany; + +import org.jboss.envers.Versioned; + +import javax.persistence.*; +import java.util.Set; + +/** + * Entity owning the many-to-many relation + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class SetOwningEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @ManyToMany + private Set references; + + public SetOwningEntity() { } + + public SetOwningEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public SetOwningEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getReferences() { + return references; + } + + public void setReferences(Set references) { + this.references = references; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetOwningEntity)) return false; + + SetOwningEntity that = (SetOwningEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwningEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwningEntity.java ___________________________________________________________________ Name: svn:mergeinfo + Added: trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwnedUniEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwnedUniEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwnedUniEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,70 @@ +package org.jboss.envers.test.entities.manytomany.unidirectional; + +import org.jboss.envers.Versioned; + +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * Many-to-many not-owning entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class ListOwnedUniEntity { + @Id + private Integer id; + + @Versioned + private String data; + + public ListOwnedUniEntity() { + } + + public ListOwnedUniEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public ListOwnedUniEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ListOwnedUniEntity)) return false; + + ListOwnedUniEntity that = (ListOwnedUniEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwnedEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Added: trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwningUniEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwningUniEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/ListOwningUniEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,81 @@ +package org.jboss.envers.test.entities.manytomany.unidirectional; + +import org.jboss.envers.Versioned; + +import javax.persistence.*; +import java.util.List; + +/** + * Entity owning the many-to-many relation + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class ListOwningUniEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @ManyToMany + private List references; + + public ListOwningUniEntity() { } + + public ListOwningUniEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public ListOwningUniEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public List getReferences() { + return references; + } + + public void setReferences(List references) { + this.references = references; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ListOwningUniEntity)) return false; + + ListOwningUniEntity that = (ListOwningUniEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwningEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Added: trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwnedUniEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwnedUniEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwnedUniEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,70 @@ +package org.jboss.envers.test.entities.manytomany.unidirectional; + +import org.jboss.envers.Versioned; + +import javax.persistence.Entity; +import javax.persistence.Id; + +/** + * Many-to-many not-owning entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class SetOwnedUniEntity { + @Id + private Integer id; + + @Versioned + private String data; + + public SetOwnedUniEntity() { + } + + public SetOwnedUniEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public SetOwnedUniEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetOwnedUniEntity)) return false; + + SetOwnedUniEntity that = (SetOwnedUniEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwnedUniEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Added: trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwningUniEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwningUniEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/unidirectional/SetOwningUniEntity.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,81 @@ +package org.jboss.envers.test.entities.manytomany.unidirectional; + +import org.jboss.envers.Versioned; + +import javax.persistence.*; +import java.util.Set; + +/** + * Entity owning the many-to-many relation + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class SetOwningUniEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @ManyToMany + private Set references; + + public SetOwningUniEntity() { } + + public SetOwningUniEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public SetOwningUniEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getReferences() { + return references; + } + + public void setReferences(Set references) { + this.references = references; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetOwningUniEntity)) return false; + + SetOwningUniEntity that = (SetOwningUniEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetOwningUniEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Copied: trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java (from rev 118, trunk/src/test/org/jboss/envers/test/integration/onetomany/BasicSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,189 @@ +package org.jboss.envers.test.integration.manytomany; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.manytomany.SetOwningEntity; +import org.jboss.envers.test.entities.manytomany.SetOwnedEntity; +import org.jboss.envers.test.tools.TestTools; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.hibernate.ejb.Ejb3Configuration; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicSet extends AbstractEntityTest { + private Integer ed1_id; + private Integer ed2_id; + + private Integer ing1_id; + private Integer ing2_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(SetOwningEntity.class); + cfg.addAnnotatedClass(SetOwnedEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + SetOwnedEntity ed1 = new SetOwnedEntity(1, "data_ed_1"); + SetOwnedEntity ed2 = new SetOwnedEntity(2, "data_ed_2"); + + SetOwningEntity ing1 = new SetOwningEntity(3, "data_ing_1"); + SetOwningEntity ing2 = new SetOwningEntity(4, "data_ing_2"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(ed1); + em.persist(ed2); + em.persist(ing1); + em.persist(ing2); + + em.getTransaction().commit(); + + // Revision 2 + + em.getTransaction().begin(); + + ing1 = em.find(SetOwningEntity.class, ing1.getId()); + ing2 = em.find(SetOwningEntity.class, ing2.getId()); + ed1 = em.find(SetOwnedEntity.class, ed1.getId()); + ed2 = em.find(SetOwnedEntity.class, ed2.getId()); + + ing1.setReferences(new HashSet()); + ing1.getReferences().add(ed1); + + ing2.setReferences(new HashSet()); + ing2.getReferences().add(ed1); + ing2.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + ing1 = em.find(SetOwningEntity.class, ing1.getId()); + ed2 = em.find(SetOwnedEntity.class, ed2.getId()); + ed1 = em.find(SetOwnedEntity.class, ed1.getId()); + + ing1.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + ing1 = em.find(SetOwningEntity.class, ing1.getId()); + ed2 = em.find(SetOwnedEntity.class, ed2.getId()); + ed1 = em.find(SetOwnedEntity.class, ed1.getId()); + + ing1.getReferences().remove(ed1); + + em.getTransaction().commit(); + + // Revision 5 + em.getTransaction().begin(); + + ing1 = em.find(SetOwningEntity.class, ing1.getId()); + + ing1.setReferences(null); + + em.getTransaction().commit(); + + // + + ed1_id = ed1.getId(); + ed2_id = ed2.getId(); + + ing1_id = ing1.getId(); + ing2_id = ing1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 4).equals(getVersionsReader().getRevisions(SetOwnedEntity.class, ed1_id)); + assert Arrays.asList(1, 2, 3, 5).equals(getVersionsReader().getRevisions(SetOwnedEntity.class, ed2_id)); + + assert Arrays.asList(1, 2, 3, 4, 5).equals(getVersionsReader().getRevisions(SetOwningEntity.class, ing1_id)); + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(SetOwningEntity.class, ing2_id)); + } + + @Test + public void testHistoryOfEdId1() { + SetOwningEntity ing1 = getEntityManager().find(SetOwningEntity.class, ing1_id); + SetOwningEntity ing2 = getEntityManager().find(SetOwningEntity.class, ing2_id); + + SetOwnedEntity rev1 = getVersionsReader().find(SetOwnedEntity.class, ed1_id, 1); + SetOwnedEntity rev2 = getVersionsReader().find(SetOwnedEntity.class, ed1_id, 2); + SetOwnedEntity rev3 = getVersionsReader().find(SetOwnedEntity.class, ed1_id, 3); + SetOwnedEntity rev4 = getVersionsReader().find(SetOwnedEntity.class, ed1_id, 4); + SetOwnedEntity rev5 = getVersionsReader().find(SetOwnedEntity.class, ed1_id, 5); + + assert rev1.getReferencing().equals(Collections.EMPTY_SET); + assert rev2.getReferencing().equals(TestTools.makeSet(ing1, ing2)); + assert rev3.getReferencing().equals(TestTools.makeSet(ing1, ing2)); + assert rev4.getReferencing().equals(TestTools.makeSet(ing2)); + assert rev5.getReferencing().equals(TestTools.makeSet(ing2)); + } + + @Test + public void testHistoryOfEdId2() { + SetOwningEntity ing1 = getEntityManager().find(SetOwningEntity.class, ing1_id); + SetOwningEntity ing2 = getEntityManager().find(SetOwningEntity.class, ing2_id); + + SetOwnedEntity rev1 = getVersionsReader().find(SetOwnedEntity.class, ed2_id, 1); + SetOwnedEntity rev2 = getVersionsReader().find(SetOwnedEntity.class, ed2_id, 2); + SetOwnedEntity rev3 = getVersionsReader().find(SetOwnedEntity.class, ed2_id, 3); + SetOwnedEntity rev4 = getVersionsReader().find(SetOwnedEntity.class, ed2_id, 4); + SetOwnedEntity rev5 = getVersionsReader().find(SetOwnedEntity.class, ed2_id, 5); + + assert rev1.getReferencing().equals(Collections.EMPTY_SET); + assert rev2.getReferencing().equals(TestTools.makeSet(ing2)); + assert rev3.getReferencing().equals(TestTools.makeSet(ing1, ing2)); + assert rev4.getReferencing().equals(TestTools.makeSet(ing1, ing2)); + assert rev5.getReferencing().equals(TestTools.makeSet(ing2)); + } + + @Test + public void testHistoryOfEdIng1() { + SetOwnedEntity ed1 = getEntityManager().find(SetOwnedEntity.class, ed1_id); + SetOwnedEntity ed2 = getEntityManager().find(SetOwnedEntity.class, ed2_id); + + SetOwningEntity rev1 = getVersionsReader().find(SetOwningEntity.class, ing1_id, 1); + SetOwningEntity rev2 = getVersionsReader().find(SetOwningEntity.class, ing1_id, 2); + SetOwningEntity rev3 = getVersionsReader().find(SetOwningEntity.class, ing1_id, 3); + SetOwningEntity rev4 = getVersionsReader().find(SetOwningEntity.class, ing1_id, 4); + SetOwningEntity rev5 = getVersionsReader().find(SetOwningEntity.class, ing1_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_SET); + assert rev2.getReferences().equals(TestTools.makeSet(ed1)); + assert rev3.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev4.getReferences().equals(TestTools.makeSet(ed2)); + assert rev5.getReferences().equals(Collections.EMPTY_SET); + } + + @Test + public void testHistoryOfEdIng2() { + SetOwnedEntity ed1 = getEntityManager().find(SetOwnedEntity.class, ed1_id); + SetOwnedEntity ed2 = getEntityManager().find(SetOwnedEntity.class, ed2_id); + + SetOwningEntity rev1 = getVersionsReader().find(SetOwningEntity.class, ing2_id, 1); + SetOwningEntity rev2 = getVersionsReader().find(SetOwningEntity.class, ing2_id, 2); + SetOwningEntity rev3 = getVersionsReader().find(SetOwningEntity.class, ing2_id, 3); + SetOwningEntity rev4 = getVersionsReader().find(SetOwningEntity.class, ing2_id, 4); + SetOwningEntity rev5 = getVersionsReader().find(SetOwningEntity.class, ing2_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_SET); + assert rev2.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev3.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev4.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev5.getReferences().equals(TestTools.makeSet(ed1, ed2)); + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java ___________________________________________________________________ Name: svn:mergeinfo + Added: trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniList.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniList.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniList.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,153 @@ +package org.jboss.envers.test.integration.manytomany.unidirectional; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.manytomany.unidirectional.ListOwnedUniEntity; +import org.jboss.envers.test.entities.manytomany.unidirectional.ListOwningUniEntity; +import org.jboss.envers.test.tools.TestTools; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.hibernate.ejb.Ejb3Configuration; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.Collections; +import java.util.ArrayList; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicUniList extends AbstractEntityTest { + private Integer ed1_id; + private Integer ed2_id; + + private Integer ing1_id; + private Integer ing2_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(ListOwningUniEntity.class); + cfg.addAnnotatedClass(ListOwnedUniEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + ListOwnedUniEntity ed1 = new ListOwnedUniEntity(1, "data_ed_1"); + ListOwnedUniEntity ed2 = new ListOwnedUniEntity(2, "data_ed_2"); + + ListOwningUniEntity ing1 = new ListOwningUniEntity(3, "data_ing_1"); + ListOwningUniEntity ing2 = new ListOwningUniEntity(4, "data_ing_2"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(ed1); + em.persist(ed2); + em.persist(ing1); + em.persist(ing2); + + em.getTransaction().commit(); + + // Revision 2 + + em.getTransaction().begin(); + + ing1 = em.find(ListOwningUniEntity.class, ing1.getId()); + ing2 = em.find(ListOwningUniEntity.class, ing2.getId()); + ed1 = em.find(ListOwnedUniEntity.class, ed1.getId()); + ed2 = em.find(ListOwnedUniEntity.class, ed2.getId()); + + ing1.setReferences(new ArrayList()); + ing1.getReferences().add(ed1); + + ing2.setReferences(new ArrayList()); + ing2.getReferences().add(ed1); + ing2.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + ing1 = em.find(ListOwningUniEntity.class, ing1.getId()); + ed2 = em.find(ListOwnedUniEntity.class, ed2.getId()); + ed1 = em.find(ListOwnedUniEntity.class, ed1.getId()); + + ing1.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + ing1 = em.find(ListOwningUniEntity.class, ing1.getId()); + ed2 = em.find(ListOwnedUniEntity.class, ed2.getId()); + ed1 = em.find(ListOwnedUniEntity.class, ed1.getId()); + + ing1.getReferences().remove(ed1); + + em.getTransaction().commit(); + + // Revision 5 + em.getTransaction().begin(); + + ing1 = em.find(ListOwningUniEntity.class, ing1.getId()); + + ing1.setReferences(null); + + em.getTransaction().commit(); + + // + + ed1_id = ed1.getId(); + ed2_id = ed2.getId(); + + ing1_id = ing1.getId(); + ing2_id = ing2.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(ListOwnedUniEntity.class, ed1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(ListOwnedUniEntity.class, ed2_id)); + + assert Arrays.asList(1, 2, 3, 4, 5).equals(getVersionsReader().getRevisions(ListOwningUniEntity.class, ing1_id)); + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(ListOwningUniEntity.class, ing2_id)); + } + + @Test + public void testHistoryOfEdIng1() { + ListOwnedUniEntity ed1 = getEntityManager().find(ListOwnedUniEntity.class, ed1_id); + ListOwnedUniEntity ed2 = getEntityManager().find(ListOwnedUniEntity.class, ed2_id); + + ListOwningUniEntity rev1 = getVersionsReader().find(ListOwningUniEntity.class, ing1_id, 1); + ListOwningUniEntity rev2 = getVersionsReader().find(ListOwningUniEntity.class, ing1_id, 2); + ListOwningUniEntity rev3 = getVersionsReader().find(ListOwningUniEntity.class, ing1_id, 3); + ListOwningUniEntity rev4 = getVersionsReader().find(ListOwningUniEntity.class, ing1_id, 4); + ListOwningUniEntity rev5 = getVersionsReader().find(ListOwningUniEntity.class, ing1_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_LIST); + assert TestTools.checkList(rev2.getReferences(), ed1); + assert TestTools.checkList(rev3.getReferences(), ed1, ed2); + assert TestTools.checkList(rev4.getReferences(), ed2); + assert rev5.getReferences().equals(Collections.EMPTY_LIST); + } + + @Test + public void testHistoryOfEdIng2() { + ListOwnedUniEntity ed1 = getEntityManager().find(ListOwnedUniEntity.class, ed1_id); + ListOwnedUniEntity ed2 = getEntityManager().find(ListOwnedUniEntity.class, ed2_id); + + ListOwningUniEntity rev1 = getVersionsReader().find(ListOwningUniEntity.class, ing2_id, 1); + ListOwningUniEntity rev2 = getVersionsReader().find(ListOwningUniEntity.class, ing2_id, 2); + ListOwningUniEntity rev3 = getVersionsReader().find(ListOwningUniEntity.class, ing2_id, 3); + ListOwningUniEntity rev4 = getVersionsReader().find(ListOwningUniEntity.class, ing2_id, 4); + ListOwningUniEntity rev5 = getVersionsReader().find(ListOwningUniEntity.class, ing2_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_LIST); + assert TestTools.checkList(rev2.getReferences(), ed1, ed2); + assert TestTools.checkList(rev3.getReferences(), ed1, ed2); + assert TestTools.checkList(rev4.getReferences(), ed1, ed2); + assert TestTools.checkList(rev5.getReferences(), ed1, ed2); + } +} \ No newline at end of file Added: trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniSet.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniSet.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/manytomany/unidirectional/BasicUniSet.java 2008-08-22 15:22:20 UTC (rev 123) @@ -0,0 +1,153 @@ +package org.jboss.envers.test.integration.manytomany.unidirectional; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.manytomany.unidirectional.SetOwnedUniEntity; +import org.jboss.envers.test.entities.manytomany.unidirectional.SetOwningUniEntity; +import org.jboss.envers.test.tools.TestTools; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.hibernate.ejb.Ejb3Configuration; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicUniSet extends AbstractEntityTest { + private Integer ed1_id; + private Integer ed2_id; + + private Integer ing1_id; + private Integer ing2_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(SetOwningUniEntity.class); + cfg.addAnnotatedClass(SetOwnedUniEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + SetOwnedUniEntity ed1 = new SetOwnedUniEntity(1, "data_ed_1"); + SetOwnedUniEntity ed2 = new SetOwnedUniEntity(2, "data_ed_2"); + + SetOwningUniEntity ing1 = new SetOwningUniEntity(3, "data_ing_1"); + SetOwningUniEntity ing2 = new SetOwningUniEntity(4, "data_ing_2"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(ed1); + em.persist(ed2); + em.persist(ing1); + em.persist(ing2); + + em.getTransaction().commit(); + + // Revision 2 + + em.getTransaction().begin(); + + ing1 = em.find(SetOwningUniEntity.class, ing1.getId()); + ing2 = em.find(SetOwningUniEntity.class, ing2.getId()); + ed1 = em.find(SetOwnedUniEntity.class, ed1.getId()); + ed2 = em.find(SetOwnedUniEntity.class, ed2.getId()); + + ing1.setReferences(new HashSet()); + ing1.getReferences().add(ed1); + + ing2.setReferences(new HashSet()); + ing2.getReferences().add(ed1); + ing2.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + ing1 = em.find(SetOwningUniEntity.class, ing1.getId()); + ed2 = em.find(SetOwnedUniEntity.class, ed2.getId()); + ed1 = em.find(SetOwnedUniEntity.class, ed1.getId()); + + ing1.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + ing1 = em.find(SetOwningUniEntity.class, ing1.getId()); + ed2 = em.find(SetOwnedUniEntity.class, ed2.getId()); + ed1 = em.find(SetOwnedUniEntity.class, ed1.getId()); + + ing1.getReferences().remove(ed1); + + em.getTransaction().commit(); + + // Revision 5 + em.getTransaction().begin(); + + ing1 = em.find(SetOwningUniEntity.class, ing1.getId()); + + ing1.setReferences(null); + + em.getTransaction().commit(); + + // + + ed1_id = ed1.getId(); + ed2_id = ed2.getId(); + + ing1_id = ing1.getId(); + ing2_id = ing2.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(SetOwnedUniEntity.class, ed1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(SetOwnedUniEntity.class, ed2_id)); + + assert Arrays.asList(1, 2, 3, 4, 5).equals(getVersionsReader().getRevisions(SetOwningUniEntity.class, ing1_id)); + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(SetOwningUniEntity.class, ing2_id)); + } + + @Test + public void testHistoryOfEdIng1() { + SetOwnedUniEntity ed1 = getEntityManager().find(SetOwnedUniEntity.class, ed1_id); + SetOwnedUniEntity ed2 = getEntityManager().find(SetOwnedUniEntity.class, ed2_id); + + SetOwningUniEntity rev1 = getVersionsReader().find(SetOwningUniEntity.class, ing1_id, 1); + SetOwningUniEntity rev2 = getVersionsReader().find(SetOwningUniEntity.class, ing1_id, 2); + SetOwningUniEntity rev3 = getVersionsReader().find(SetOwningUniEntity.class, ing1_id, 3); + SetOwningUniEntity rev4 = getVersionsReader().find(SetOwningUniEntity.class, ing1_id, 4); + SetOwningUniEntity rev5 = getVersionsReader().find(SetOwningUniEntity.class, ing1_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_SET); + assert rev2.getReferences().equals(TestTools.makeSet(ed1)); + assert rev3.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev4.getReferences().equals(TestTools.makeSet(ed2)); + assert rev5.getReferences().equals(Collections.EMPTY_SET); + } + + @Test + public void testHistoryOfEdIng2() { + SetOwnedUniEntity ed1 = getEntityManager().find(SetOwnedUniEntity.class, ed1_id); + SetOwnedUniEntity ed2 = getEntityManager().find(SetOwnedUniEntity.class, ed2_id); + + SetOwningUniEntity rev1 = getVersionsReader().find(SetOwningUniEntity.class, ing2_id, 1); + SetOwningUniEntity rev2 = getVersionsReader().find(SetOwningUniEntity.class, ing2_id, 2); + SetOwningUniEntity rev3 = getVersionsReader().find(SetOwningUniEntity.class, ing2_id, 3); + SetOwningUniEntity rev4 = getVersionsReader().find(SetOwningUniEntity.class, ing2_id, 4); + SetOwningUniEntity rev5 = getVersionsReader().find(SetOwningUniEntity.class, ing2_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_SET); + assert rev2.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev3.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev4.getReferences().equals(TestTools.makeSet(ed1, ed2)); + assert rev5.getReferences().equals(TestTools.makeSet(ed1, ed2)); + } +} \ No newline at end of file Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-22 12:19:38 UTC (rev 122) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-22 15:22:20 UTC (rev 123) @@ -22,13 +22,13 @@ private String str2; @Versioned - @OneToMany //(mappedBy="we2") - //@ManyToMany + //@OneToMany //(mappedBy="we2") + @ManyToMany //@Transient private Set we1s; //@Versioned - //@OneToOne(mappedBy = "we2") + //@OneToOne @Transient private WorkingEntity1 we1; From jboss-envers-commits at lists.jboss.org Fri Aug 22 12:24:06 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Fri, 22 Aug 2008 12:24:06 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r124 - in trunk: src/main/org/jboss/envers/configuration and 12 other directories. Message-ID: Author: adamw Date: 2008-08-22 12:24:06 -0400 (Fri, 22 Aug 2008) New Revision: 124 Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/DetachedRelationQueryGenerator.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyAttachedMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneNotOwningIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyAttachedInitializor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ListRefCollEntity.java trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids/ trunk/src/test/org/jboss/envers/test/integration/naming/DetachedNamingTestEntity.java trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedList.java trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithEmbId.java trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithMulId.java trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DataChangesNotOwnedSet.java Removed: trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/ Modified: trunk/resources/test/testng.xml trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetRefCollEntity.java trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids/SetRefCollEntityEmbId.java trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids/SetRefCollEntityMulId.java trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java trunk/src/test/org/jboss/envers/test/working/WorkingMain.java Log: ENVERS-24: renaming Modified: trunk/resources/test/testng.xml =================================================================== --- trunk/resources/test/testng.xml 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/resources/test/testng.xml 2008-08-22 16:24:06 UTC (rev 124) @@ -11,10 +11,12 @@ + + - + Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-22 16:24:06 UTC (rev 124) @@ -75,7 +75,7 @@ for (Document additionalMapping : mappingData.getAdditionalMappings()) { cfg.addDocument(writer.write(additionalMapping)); - writeDocument(additionalMapping); + //writeDocument(additionalMapping); } } catch (DocumentException e) { throw new MappingException(e); Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-22 16:24:06 UTC (rev 124) @@ -36,9 +36,9 @@ import org.jboss.envers.entities.mapper.*; import org.jboss.envers.entities.mapper.id.*; import org.jboss.envers.entities.mapper.relation.ToOneIdMapper; -import org.jboss.envers.entities.mapper.relation.OneToOneIdMapper; -import org.jboss.envers.entities.mapper.relation.OneToManyBidirectionalMapper; -import org.jboss.envers.entities.mapper.relation.OneToManyUnidirectionalMapper; +import org.jboss.envers.entities.mapper.relation.OneToOneNotOwningIdMapper; +import org.jboss.envers.entities.mapper.relation.OneToManyAttachedMapper; +import org.jboss.envers.entities.mapper.relation.OneToManyDetachedMapper; import org.jboss.envers.tools.StringTools; import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.HibernateVersion; @@ -240,7 +240,7 @@ } @SuppressWarnings({"unchecked"}) - private void addOneToOneBidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { + private void addOneToOneNotOwning(Property property, CompositeMapperBuilder mapper, String entityName) { OneToOne propertyValue = (OneToOne) property.getValue(); String owningReferencePropertyName = propertyValue.getReferencedPropertyName(); // mappedBy @@ -264,11 +264,11 @@ IdMapper ownedIdMapper = ownedIdMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); // Storing information about this relation - entitiesConfigurations.get(entityName).addOneToOneRelation(propertyName, owningReferencePropertyName, + entitiesConfigurations.get(entityName).addOneToOneNotOwningRelation(propertyName, owningReferencePropertyName, referencedEntityName, ownedIdMapper); // Adding mapper for the id - mapper.addComposite(propertyName, new OneToOneIdMapper(owningReferencePropertyName, + mapper.addComposite(propertyName, new OneToOneNotOwningIdMapper(owningReferencePropertyName, referencedEntityName, propertyName)); } @@ -290,7 +290,7 @@ } @SuppressWarnings({"unchecked"}) - private void addOneToManyBidirectional(Property property, CompositeMapperBuilder mapper, String entityName) { + private void addOneToManyAttached(Property property, CompositeMapperBuilder mapper, String entityName) { Collection propertyValue = (Collection) property.getValue(); String owningReferencePropertyName = getMappedBy(propertyValue); @@ -313,16 +313,16 @@ IdMapper ownedIdMapper = referencingIdMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix); // Storing information about this relation - entitiesConfigurations.get(entityName).addOneToManyRelation(propertyName, owningReferencePropertyName, + entitiesConfigurations.get(entityName).addOneToManyAttachedRelation(propertyName, owningReferencePropertyName, owningEntityName, ownedIdMapper); // Adding mapper for the id - mapper.addComposite(propertyName, new OneToManyBidirectionalMapper(owningReferencePropertyName, owningEntityName, + mapper.addComposite(propertyName, new OneToManyAttachedMapper(owningReferencePropertyName, owningEntityName, propertyName)); } @SuppressWarnings({"unchecked"}) - private void addOneToManyUnidirectional(Property property, CompositeMapperBuilder mapper, String entityName, + private void addOneToManyDetached(Property property, CompositeMapperBuilder mapper, String entityName, EntityMappingData mappingData) { Collection propertyValue = (Collection) property.getValue(); ManyToOne mto = (ManyToOne) propertyValue.getElement(); @@ -375,8 +375,12 @@ addRevisionNumber(middleEntityId); addRevisionType(middleEntity); + // TODO storing information about this relation + //entitiesConfigurations.get(entityName).addOneToManyAttachedRelation(propertyName, owningReferencePropertyName, + // owningEntityName, ownedIdMapper); + // Adding the property mapper - mapper.addComposite(property.getName(), new OneToManyUnidirectionalMapper(verEntCfg, entityName, + mapper.addComposite(property.getName(), new OneToManyDetachedMapper(verEntCfg, entityName, referencedEntityName, property.getName(), verEntCfg.getVersionsEntityName(referencedEntityName), versionsMiddleEntityName, referencingIdMapping.getIdMapper().prefixMappedProperties(referencingPrefix), referencedIdMapping.getIdMapper().prefixMappedProperties(referencedPrefix), @@ -385,6 +389,11 @@ // TODO: ??? } + private void addManyToManyNotOwning(Property property, CompositeMapperBuilder mapper, String entityName, + EntityMappingData mappingData) { + System.out.println("XXX"); + } + private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo, List unversionedProperties) { /* @@ -458,7 +467,7 @@ } else if (propertyType instanceof OneToOneType) { // only second pass if (!firstPass) { - addOneToOneBidirectional(property, currentMapper, entityName); + addOneToOneNotOwning(property, currentMapper, entityName); } } else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals( propertyType.getClass().getName())) { @@ -477,14 +486,22 @@ ((((Collection) property.getValue()).getElement() instanceof OneToMany))) { // only second pass if (!firstPass) { - addOneToManyBidirectional(property, currentMapper, entityName); + addOneToManyAttached(property, currentMapper, entityName); } } else if ((propertyType instanceof BagType || propertyType instanceof SetType) && - ((((Collection) property.getValue()).getElement() instanceof ManyToOne))) { + ((((Collection) property.getValue()).getElement() instanceof ManyToOne)) && + !((Collection) property.getValue()).isInverse()) { // only second pass if (!firstPass) { - addOneToManyUnidirectional(property, currentMapper, entityName, mappingData); + addOneToManyDetached(property, currentMapper, entityName, mappingData); } + } else if ((propertyType instanceof BagType || propertyType instanceof SetType) && + ((((Collection) property.getValue()).getElement() instanceof ManyToOne)) && + ((Collection) property.getValue()).isInverse()) { + // only second pass + if (!firstPass) { + addManyToManyNotOwning(property, currentMapper, entityName, mappingData); + } } else { String message = "Type not supported for versioning: " + propertyType.getClass().getName() + ", on entity " + entityName + ", property '" + property.getName() + "'."; Modified: trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-22 16:24:06 UTC (rev 124) @@ -55,13 +55,13 @@ toEntityName, null, idMapper)); } - public void addOneToOneRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, + public void addOneToOneNotOwningRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, IdMapper idMapper) { relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationType.ONE_TO_ONE, toEntityName, mappedByPropertyName, idMapper)); } - public void addOneToManyRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, + public void addOneToManyAttachedRelation(String fromPropertyName, String mappedByPropertyName, String toEntityName, IdMapper idMapper) { relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationType.ONE_TO_MANY, toEntityName, mappedByPropertyName, idMapper)); Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/DetachedRelationQueryGenerator.java (from rev 117, trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/DetachedRelationQueryGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/DetachedRelationQueryGenerator.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,93 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.id.QueryParameterData; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.RevisionType; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.hibernate.Query; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DetachedRelationQueryGenerator { + private final String queryString; + private final IdMapper referencingMiddleIdMapper; + + public DetachedRelationQueryGenerator(VersionsEntitiesConfiguration verEntCfg, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { + this.referencingMiddleIdMapper = referencingMiddleIdMapper; + + /* + * The query that we need to create: + * SELECT e FROM versionsReferencedEntity e, middleEntity ee + * WHERE + * (selecting e entities at revision :revision) + * e.revision = (SELECT max(e2.revision) FROM referencedEntity e2 + * WHERE e2.revision <= :revision AND e2.id1 = e.id1) AND + * (only entities referenced by the association) + * ee.id1 = e.id1 AND + * ee.id2 = :id2 AND + * (the association at revision :revision) + * ee.revision = (SELECT max(ee2.revision) FROM middleEntity ee2 + * WHERE ee2.revision <= :revision AND ee2.id2 = :id2 AND ee2.id1 = ee.id1) AND + * (only non-deleted entities and associations) + * ee.revision_type != DEL AND + * e.revision_type != DEL + */ + String revisionPropertyPath = verEntCfg.getRevisionPropPath(); + String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); + + StringBuilder querySB = new StringBuilder(); + querySB + .append("SELECT e FROM ").append(versionsReferencedEntityName).append(" e") + .append(", ").append(versionsMiddleEntityName).append(" ee ") + .append("WHERE ") + // e.revision = (SELECT max(e2.revision) ... + .append("e.").append(revisionPropertyPath).append(" = (SELECT max(e2.").append(revisionPropertyPath) + .append(") FROM ").append(versionsReferencedEntityName).append(" e2 ") + // e2.revision <= :revision + .append("WHERE e2.").append(revisionPropertyPath).append(" <= :revision AND ") + // e2.id1 = e.id1) + .append(referencedIdMapper.getIdsEqualQuery("e." + originalIdPropertyName, "e2." + originalIdPropertyName)) + .append(") AND ") + // ee.id1 = e.id1 + .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, + referencedIdMapper, "e." + originalIdPropertyName)) + .append(" AND ") + // ee.id2 = :id2 + .append(referencingMiddleIdMapper.getIdEqualsQuery("ee." + originalIdPropertyName, true)) + .append(" AND ") + // ee.revision = (SELECT max(ee2.revision) ... + .append("ee.").append(revisionPropertyPath).append(" = (SELECT max(ee2.").append(revisionPropertyPath) + .append(") FROM ").append(versionsMiddleEntityName).append(" ee2 ") + // ee2.revision <= :revision + .append("WHERE ee2.").append(revisionPropertyPath).append(" <= :revision AND ") + // ee2.id2 = :id2) + .append(referencingMiddleIdMapper.getIdEqualsQuery("ee2." + originalIdPropertyName, true)) + .append(" AND ") + // ee2.id1 = ee.id1) + .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, "ee2." + originalIdPropertyName)) + .append(") AND ") + // e.revision_type != DEL AND + .append("e.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype") + .append(" AND ") + // ee.revision_type != DEL + .append("ee.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype"); + + queryString = querySB.toString(); + } + + public Query getQuery(VersionsReaderImplementor versionsReader, Object primaryKey, Number revision) { + Query query = versionsReader.getSession().createQuery(queryString); + query.setParameter("revision", revision); + query.setParameter("delrevisiontype", RevisionType.DEL); + for (QueryParameterData paramData: referencingMiddleIdMapper.mapToQueryParametersFromId(primaryKey)) { + paramData.setParameterValue(query); + } + + return query; + } +} Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyAttachedMapper.java (from rev 117, trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyAttachedMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyAttachedMapper.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,64 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.entities.mapper.relation.lazy.OneToManyAttachedInitializor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.hibernate.collection.PersistentCollection; + +import java.util.*; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyAttachedMapper extends AbstractOneToManyMapper implements PropertyMapper { + private final String owningReferencePropertyName; + + public OneToManyAttachedMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { + super(owningEntityName, propertyName); + + this.owningReferencePropertyName = owningReferencePropertyName; + } + + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + return false; + } + + protected Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, + Class collectionClass) { + return new OneToManyAttachedInitializor(versionsReader, entityClass, owningReferencePropertyName, primaryKey, + revision, collectionClass); + } + + public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, + Serializable oldColl, Serializable id) { + return null; + } +} \ No newline at end of file Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java (from rev 117, trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,121 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.lazy.OneToManyDetachedInitializor; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.jboss.envers.RevisionType; +import org.hibernate.collection.PersistentCollection; + +import java.util.*; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyDetachedMapper extends AbstractOneToManyMapper implements PropertyMapper { + private final VersionsEntitiesConfiguration verEntCfg; + /** + * Name of the entity that declares the relation. + */ + private final String referencedEntityName; + /** + * Name of the property in referencedEntityName that holds the value of the relation. + */ + private final String collectionReferencingPropertyName; + /** + * Generated middle entity, which stores the bindings of the relation. + */ + private final String versionsMiddleEntityName; + private final IdMapper referencingMiddleIdMapper; + private final IdMapper referencedMiddleIdMapper; + + private final DetachedRelationQueryGenerator queryGenerator; + + public OneToManyDetachedMapper(VersionsEntitiesConfiguration verEntCfg, String referencingEntityName, + String referencedEntityName, String collectionReferencingPropertyName, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { + super(referencingEntityName, collectionReferencingPropertyName); + + this.verEntCfg = verEntCfg; + this.referencedEntityName = referencedEntityName; + this.collectionReferencingPropertyName = collectionReferencingPropertyName; + this.versionsMiddleEntityName = versionsMiddleEntityName; + this.referencingMiddleIdMapper = referencingMiddleIdMapper; + this.referencedMiddleIdMapper = referencedMiddleIdMapper; + + queryGenerator = new DetachedRelationQueryGenerator(verEntCfg, versionsReferencedEntityName, + versionsMiddleEntityName, referencingMiddleIdMapper, referencedMiddleIdMapper, referencedIdMapper); + } + + private Collection getOldCollection(Serializable oldColl) { + if (oldColl instanceof Map) { + return ((Map) oldColl).keySet(); + } else { + return (Collection) oldColl; + } + } + + private void addCollectionChanges(List collectionChanges, Set changed, + RevisionType revisionType, Serializable id) { + for (Object changedEntity : changed) { + Map entityData = new HashMap(); + Map originalId = new HashMap(); + entityData.put(verEntCfg.getOriginalIdPropName(), originalId); + + collectionChanges.add(new PersistentCollectionChangeData(versionsMiddleEntityName, entityData)); + referencingMiddleIdMapper.mapToMapFromId(originalId, id); + referencedMiddleIdMapper.mapToMapFromEntity(originalId, changedEntity); + + entityData.put(verEntCfg.getRevisionTypePropName(), revisionType); + } + } + + @SuppressWarnings({"unchecked"}) + public List mapCollectionChanges(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, Serializable id) { + if (!collectionReferencingPropertyName.equals(referencingPropertyName)) { + return null; + } + + List collectionChanges = new ArrayList(); + + Collection newCollection = (Collection) newColl; + Collection oldCollection = getOldCollection(oldColl); + + Set added = new HashSet(); + if (newColl != null) { added.addAll(newCollection); } + if (oldColl != null) { added.removeAll(oldCollection); } + + addCollectionChanges(collectionChanges, added, RevisionType.ADD, id); + + Set deleted = new HashSet(); + if (oldColl != null) { deleted.addAll(oldCollection); } + if (newColl != null) { deleted.removeAll(newCollection); } + + addCollectionChanges(collectionChanges, deleted, RevisionType.DEL, id); + + return collectionChanges; + } + + @SuppressWarnings({"unchecked"}) + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + // Changes are mapped in the "mapCollectionChanges" method. + return false; + } + + protected Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, Class collectionClass) { + return new OneToManyDetachedInitializor(verCfg, referencedEntityName, queryGenerator, + versionsReader, primaryKey, revision, collectionClass); + } +} Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneNotOwningIdMapper.java (from rev 116, trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneNotOwningIdMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneNotOwningIdMapper.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,87 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.tools.reflection.ReflectionTools; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.hibernate.property.Setter; +import org.hibernate.NonUniqueResultException; +import org.hibernate.collection.PersistentCollection; + +import javax.persistence.NoResultException; +import java.util.Map; +import java.util.List; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToOneNotOwningIdMapper implements PropertyMapper { + private String owningReferencePropertyName; + private String owningEntityName; + private String propertyName; + + public OneToOneNotOwningIdMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { + this.owningReferencePropertyName = owningReferencePropertyName; + this.owningEntityName = owningEntityName; + this.propertyName = propertyName; + } + + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + return false; + } + + public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { + if (obj == null) { + return; + } + + Class entityClass = ReflectionTools.loadClass(owningEntityName); + + Object value; + + try { + value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) + .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getSingleResult(); + } catch (NoResultException e) { + value = null; + } catch (NonUniqueResultException e) { + throw new VersionsException("Many versions results for one-to-one relationship: (" + owningEntityName + + ", " + owningReferencePropertyName + ")"); + } + + Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); + setter.set(obj, value, null); + } + + public List mapCollectionChanges(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, + Serializable id) { + return null; + } +} Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyAttachedInitializor.java (from rev 117, trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyAttachedInitializor.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyAttachedInitializor.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,74 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.entities.mapper.relation.lazy; + +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.query.VersionsRestrictions; +import org.jboss.envers.exception.VersionsException; + +import java.util.Collection; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyAttachedInitializor implements Initializor { + private VersionsReaderImplementor versionsReader; + private Class entityClass; + private String owningReferencePropertyName; + private Object primaryKey; + private Number revision; + private Class collectionClass; + + public OneToManyAttachedInitializor(VersionsReaderImplementor versionsReader, Class entityClass, + String owningReferencePropertyName, Object primaryKey, Number revision, + Class collectionClass) { + this.versionsReader = versionsReader; + this.entityClass = entityClass; + this.owningReferencePropertyName = owningReferencePropertyName; + this.primaryKey = primaryKey; + this.revision = revision; + this.collectionClass = collectionClass; + } + + @SuppressWarnings({"unchecked"}) + public T initialize() { + List queryResult = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) + .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getResultList(); + + if (collectionClass.isAssignableFrom(queryResult.getClass())) { + return (T) queryResult; + } else { + Collection result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + result.addAll(queryResult); + + return (T) result; + } + } +} Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java (from rev 117, trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,55 @@ +package org.jboss.envers.entities.mapper.relation.lazy; + +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.DetachedRelationQueryGenerator; +import org.jboss.envers.entities.EntityInstantiator; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; + +import java.util.Collection; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class OneToManyDetachedInitializor implements Initializor { + private final VersionsConfiguration verCfg; + private final String entityName; + private final DetachedRelationQueryGenerator queryGenerator; + private final VersionsReaderImplementor versionsReader; + private final Object primaryKey; + private final Number revision; + private final Class collectionClass; + + public OneToManyDetachedInitializor(VersionsConfiguration verCfg, String entityName, + DetachedRelationQueryGenerator queryGenerator, + VersionsReaderImplementor versionsReader, Object primaryKey, + Number revision, Class collectionClass) { + this.verCfg = verCfg; + this.entityName = entityName; + this.queryGenerator = queryGenerator; + this.versionsReader = versionsReader; + this.primaryKey = primaryKey; + this.revision = revision; + this.collectionClass = collectionClass; + } + + @SuppressWarnings({"unchecked"}) + public T initialize() { + EntityInstantiator entityInstantiator = new EntityInstantiator(verCfg, versionsReader); + + List queryResult = queryGenerator.getQuery(versionsReader, primaryKey, revision).list(); + + T result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + entityInstantiator.addInstancesFromVersionsEntities(entityName, result, queryResult, revision); + + return result; + } +} Modified: trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/SetOwnedEntity.java 2008-08-22 16:24:06 UTC (rev 124) @@ -20,7 +20,7 @@ private String data; @Versioned - @ManyToMany(mappedBy="referencing") + @ManyToMany(mappedBy="references") private Set referencing; public SetOwnedEntity() { Copied: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached (from rev 117, trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional) Copied: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ListRefCollEntity.java (from rev 118, trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ListRefCollEntity.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ListRefCollEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ListRefCollEntity.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,85 @@ +package org.jboss.envers.test.entities.onetomany.detached; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.StrTestEntity; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import java.util.List; + +/** + * Set collection of references entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class ListRefCollEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @OneToMany + private List collection; + + public ListRefCollEntity() { + } + + public ListRefCollEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public ListRefCollEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public List getCollection() { + return collection; + } + + public void setCollection(List collection) { + this.collection = collection; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ListRefCollEntity)) return false; + + ListRefCollEntity that = (ListRefCollEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "SetRefEdEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Modified: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetRefCollEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/SetRefCollEntity.java 2008-08-21 11:18:53 UTC (rev 117) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetRefCollEntity.java 2008-08-22 16:24:06 UTC (rev 124) @@ -1,4 +1,4 @@ -package org.jboss.envers.test.entities.onetomany.unidirectional; +package org.jboss.envers.test.entities.onetomany.detached; import org.jboss.envers.Versioned; import org.jboss.envers.test.entities.StrTestEntity; Copied: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids (from rev 119, trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids) Modified: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids/SetRefCollEntityEmbId.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityEmbId.java 2008-08-21 13:56:27 UTC (rev 119) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids/SetRefCollEntityEmbId.java 2008-08-22 16:24:06 UTC (rev 124) @@ -1,4 +1,4 @@ -package org.jboss.envers.test.entities.onetomany.unidirectional.ids; +package org.jboss.envers.test.entities.onetomany.detached.ids; import org.jboss.envers.Versioned; import org.jboss.envers.test.entities.ids.EmbId; Modified: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids/SetRefCollEntityMulId.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/unidirectional/ids/SetRefCollEntityMulId.java 2008-08-21 13:56:27 UTC (rev 119) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/ids/SetRefCollEntityMulId.java 2008-08-22 16:24:06 UTC (rev 124) @@ -1,4 +1,4 @@ -package org.jboss.envers.test.entities.onetomany.unidirectional.ids; +package org.jboss.envers.test.entities.onetomany.detached.ids; import org.jboss.envers.Versioned; import org.jboss.envers.test.entities.ids.MulIdTestEntity; Copied: trunk/src/test/org/jboss/envers/test/integration/naming/DetachedNamingTestEntity.java (from rev 120, trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/DetachedNamingTestEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/naming/DetachedNamingTestEntity.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,85 @@ +package org.jboss.envers.test.integration.naming; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.StrTestEntity; + +import javax.persistence.*; +import java.util.Set; + +/** + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class DetachedNamingTestEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @OneToMany + @JoinTable(name = "UNI_NAMING_TEST", + joinColumns = @JoinColumn(name = "ID_1"), + inverseJoinColumns = @JoinColumn(name = "ID_2")) + private Set collection; + + public DetachedNamingTestEntity() { + } + + public DetachedNamingTestEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public DetachedNamingTestEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getCollection() { + return collection; + } + + public void setCollection(Set collection) { + this.collection = collection; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DetachedNamingTestEntity)) return false; + + DetachedNamingTestEntity that = (DetachedNamingTestEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "DetachedNamingTestEntity(id = " + id + ", data = " + data + ")"; + } +} Modified: trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-22 16:24:06 UTC (rev 124) @@ -21,13 +21,13 @@ private Integer str1_id; public void configure(Ejb3Configuration cfg) { - cfg.addAnnotatedClass(UnidirectionalNamingTestEntity.class); + cfg.addAnnotatedClass(DetachedNamingTestEntity.class); cfg.addAnnotatedClass(StrTestEntity.class); } @BeforeClass(dependsOnMethods = "init") public void initData() { - UnidirectionalNamingTestEntity uni1 = new UnidirectionalNamingTestEntity(1, "data1"); + DetachedNamingTestEntity uni1 = new DetachedNamingTestEntity(1, "data1"); StrTestEntity str1 = new StrTestEntity("str1"); // Revision 1 @@ -43,7 +43,7 @@ // Revision 2 em.getTransaction().begin(); - uni1 = em.find(UnidirectionalNamingTestEntity.class, uni1.getId()); + uni1 = em.find(DetachedNamingTestEntity.class, uni1.getId()); str1 = em.find(StrTestEntity.class, str1.getId()); uni1.getCollection().add(str1); @@ -57,7 +57,7 @@ @Test public void testRevisionsCounts() { - assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(UnidirectionalNamingTestEntity.class, uni1_id)); + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(DetachedNamingTestEntity.class, uni1_id)); assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); } @@ -65,8 +65,8 @@ public void testHistoryOfUniId1() { StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); - UnidirectionalNamingTestEntity rev1 = getVersionsReader().find(UnidirectionalNamingTestEntity.class, uni1_id, 1); - UnidirectionalNamingTestEntity rev2 = getVersionsReader().find(UnidirectionalNamingTestEntity.class, uni1_id, 2); + DetachedNamingTestEntity rev1 = getVersionsReader().find(DetachedNamingTestEntity.class, uni1_id, 1); + DetachedNamingTestEntity rev2 = getVersionsReader().find(DetachedNamingTestEntity.class, uni1_id, 2); assert rev1.getCollection().equals(TestTools.makeSet()); assert rev2.getCollection().equals(TestTools.makeSet(str1)); @@ -78,7 +78,7 @@ @Test public void testTableName() { assert "UNI_NAMING_TEST_versions".equals( - getCfg().getClassMapping("UnidirectionalNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") + getCfg().getClassMapping("DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") .getTable().getName()); } @@ -86,7 +86,7 @@ @Test public void testJoinColumnName() { Iterator columns = - getCfg().getClassMapping("UnidirectionalNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") + getCfg().getClassMapping("DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") .getTable().getColumnIterator(); boolean id1Found = false; Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached (from rev 117, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional) Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedList.java (from rev 118, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedList.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedList.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedList.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,115 @@ +package org.jboss.envers.test.integration.onetomany.detached; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.detached.ListRefCollEntity; +import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.ArrayList; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedList extends AbstractEntityTest { + private Integer str1_id; + private Integer str2_id; + + private Integer coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrTestEntity.class); + cfg.addAnnotatedClass(ListRefCollEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + StrTestEntity str1 = new StrTestEntity("str1"); + StrTestEntity str2 = new StrTestEntity("str2"); + + ListRefCollEntity coll1 = new ListRefCollEntity(3, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new ArrayList()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(StrTestEntity.class, str2.getId()); + coll1 = em.find(ListRefCollEntity.class, coll1.getId()); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(StrTestEntity.class, str1.getId()); + coll1 = em.find(ListRefCollEntity.class, coll1.getId()); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(ListRefCollEntity.class, coll1.getId()); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + + // + + str1_id = str1.getId(); + str2_id = str2.getId(); + + coll1_id = coll1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(ListRefCollEntity.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + StrTestEntity str2 = getEntityManager().find(StrTestEntity.class, str2_id); + + ListRefCollEntity rev1 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 1); + ListRefCollEntity rev2 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 2); + ListRefCollEntity rev3 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 3); + ListRefCollEntity rev4 = getVersionsReader().find(ListRefCollEntity.class, coll1_id, 4); + + assert TestTools.checkList(rev1.getCollection(), str1); + assert TestTools.checkList(rev2.getCollection(), str1, str2); + assert TestTools.checkList(rev3.getCollection(), str2); + assert TestTools.checkList(rev4.getCollection()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + } +} \ No newline at end of file Deleted: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java 2008-08-21 11:18:53 UTC (rev 117) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java 2008-08-22 16:24:06 UTC (rev 124) @@ -1,123 +0,0 @@ -package org.jboss.envers.test.integration.onetomany.unidirectional; - -import org.jboss.envers.test.integration.AbstractEntityTest; -import org.jboss.envers.test.entities.onetomany.unidirectional.SetRefCollEntity; -import org.jboss.envers.test.entities.StrTestEntity; -import org.hibernate.ejb.Ejb3Configuration; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import javax.persistence.EntityManager; -import java.util.Arrays; -import java.util.Set; -import java.util.HashSet; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class BasicNotOwnedSet extends AbstractEntityTest { - private Integer str1_id; - private Integer str2_id; - - private Integer coll1_id; - - public void configure(Ejb3Configuration cfg) { - cfg.addAnnotatedClass(StrTestEntity.class); - cfg.addAnnotatedClass(SetRefCollEntity.class); - } - - @BeforeClass(dependsOnMethods = "init") - public void initData() { - EntityManager em = getEntityManager(); - - StrTestEntity str1 = new StrTestEntity("str1"); - StrTestEntity str2 = new StrTestEntity("str2"); - - SetRefCollEntity coll1 = new SetRefCollEntity(3, "coll1"); - - // Revision 1 - em.getTransaction().begin(); - - em.persist(str1); - em.persist(str2); - - coll1.setCollection(new HashSet()); - coll1.getCollection().add(str1); - em.persist(coll1); - - em.getTransaction().commit(); - - // Revision 2 - em.getTransaction().begin(); - - str2 = em.find(StrTestEntity.class, str2.getId()); - coll1 = em.find(SetRefCollEntity.class, coll1.getId()); - - coll1.getCollection().add(str2); - - em.getTransaction().commit(); - - // Revision 3 - em.getTransaction().begin(); - - str1 = em.find(StrTestEntity.class, str1.getId()); - coll1 = em.find(SetRefCollEntity.class, coll1.getId()); - - coll1.getCollection().remove(str1); - - em.getTransaction().commit(); - - // Revision 4 - em.getTransaction().begin(); - - coll1 = em.find(SetRefCollEntity.class, coll1.getId()); - - coll1.getCollection().clear(); - - em.getTransaction().commit(); - - // - - str1_id = str1.getId(); - str2_id = str2.getId(); - - coll1_id = coll1.getId(); - } - - @Test - public void testRevisionsCounts() { - assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(SetRefCollEntity.class, coll1_id)); - - assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); - assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id)); - } - - @SuppressWarnings({"ManualArrayToCollectionCopy"}) - private Set makeSet(T... objects) { - Set ret = new HashSet(); - for (T obj : objects) { ret.add(obj); } - return ret; - } - - @Test - public void testHistoryOfColl1() { - StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); - StrTestEntity str2 = getEntityManager().find(StrTestEntity.class, str2_id); - - SetRefCollEntity rev1 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 1); - SetRefCollEntity rev2 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 2); - SetRefCollEntity rev3 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 3); - SetRefCollEntity rev4 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 4); - - assert rev1.getCollection().equals(makeSet(str1)); - assert rev2.getCollection().equals(makeSet(str1, str2)); - assert rev3.getCollection().equals(makeSet(str2)); - assert rev4.getCollection().equals(makeSet()); - - assert "coll1".equals(rev1.getData()); - assert "coll1".equals(rev2.getData()); - assert "coll1".equals(rev3.getData()); - assert "coll1".equals(rev4.getData()); - - } -} Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java (from rev 118, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,115 @@ +package org.jboss.envers.test.integration.onetomany.detached; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.detached.SetRefCollEntity; +import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedSet extends AbstractEntityTest { + private Integer str1_id; + private Integer str2_id; + + private Integer coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + StrTestEntity str1 = new StrTestEntity("str1"); + StrTestEntity str2 = new StrTestEntity("str2"); + + SetRefCollEntity coll1 = new SetRefCollEntity(3, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new HashSet()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(StrTestEntity.class, str2.getId()); + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(StrTestEntity.class, str1.getId()); + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + + // + + str1_id = str1.getId(); + str2_id = str2.getId(); + + coll1_id = coll1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(SetRefCollEntity.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + StrTestEntity str2 = getEntityManager().find(StrTestEntity.class, str2_id); + + SetRefCollEntity rev1 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 1); + SetRefCollEntity rev2 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 2); + SetRefCollEntity rev3 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 3); + SetRefCollEntity rev4 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 4); + + assert rev1.getCollection().equals(TestTools.makeSet(str1)); + assert rev2.getCollection().equals(TestTools.makeSet(str1, str2)); + assert rev3.getCollection().equals(TestTools.makeSet(str2)); + assert rev4.getCollection().equals(TestTools.makeSet()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + } +} Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithEmbId.java (from rev 119, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithEmbId.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithEmbId.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithEmbId.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,114 @@ +package org.jboss.envers.test.integration.onetomany.detached; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.detached.ids.SetRefCollEntityEmbId; +import org.jboss.envers.test.entities.ids.EmbIdTestEntity; +import org.jboss.envers.test.entities.ids.EmbId; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedSetWithEmbId extends AbstractEntityTest { + private EmbId str1_id; + private EmbId str2_id; + + private EmbId coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(EmbIdTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntityEmbId.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + str1_id = new EmbId(1, 2); + str2_id = new EmbId(3, 4); + + coll1_id = new EmbId(5, 6); + + EmbIdTestEntity str1 = new EmbIdTestEntity(str1_id, "str1"); + EmbIdTestEntity str2 = new EmbIdTestEntity(str2_id, "str2"); + + SetRefCollEntityEmbId coll1 = new SetRefCollEntityEmbId(coll1_id, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new HashSet()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(EmbIdTestEntity.class, str2.getId()); + coll1 = em.find(SetRefCollEntityEmbId.class, coll1.getId()); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(EmbIdTestEntity.class, str1.getId()); + coll1 = em.find(SetRefCollEntityEmbId.class, coll1.getId()); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(SetRefCollEntityEmbId.class, coll1.getId()); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(SetRefCollEntityEmbId.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(EmbIdTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(EmbIdTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + EmbIdTestEntity str1 = getEntityManager().find(EmbIdTestEntity.class, str1_id); + EmbIdTestEntity str2 = getEntityManager().find(EmbIdTestEntity.class, str2_id); + + SetRefCollEntityEmbId rev1 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 1); + SetRefCollEntityEmbId rev2 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 2); + SetRefCollEntityEmbId rev3 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 3); + SetRefCollEntityEmbId rev4 = getVersionsReader().find(SetRefCollEntityEmbId.class, coll1_id, 4); + + assert rev1.getCollection().equals(TestTools.makeSet(str1)); + assert rev2.getCollection().equals(TestTools.makeSet(str1, str2)); + assert rev3.getCollection().equals(TestTools.makeSet(str2)); + assert rev4.getCollection().equals(TestTools.makeSet()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + } +} \ No newline at end of file Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithMulId.java (from rev 119, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/BasicNotOwnedSetWithMulId.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithMulId.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSetWithMulId.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,114 @@ +package org.jboss.envers.test.integration.onetomany.detached; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.detached.ids.SetRefCollEntityMulId; +import org.jboss.envers.test.entities.ids.MulIdTestEntity; +import org.jboss.envers.test.entities.ids.MulId; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicNotOwnedSetWithMulId extends AbstractEntityTest { + private MulId str1_id; + private MulId str2_id; + + private MulId coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(MulIdTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntityMulId.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + str1_id = new MulId(1, 2); + str2_id = new MulId(3, 4); + + coll1_id = new MulId(5, 6); + + MulIdTestEntity str1 = new MulIdTestEntity(str1_id.getId1(), str1_id.getId2(), "str1"); + MulIdTestEntity str2 = new MulIdTestEntity(str2_id.getId1(), str2_id.getId2(), "str2"); + + SetRefCollEntityMulId coll1 = new SetRefCollEntityMulId(coll1_id.getId1(), coll1_id.getId2(), "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new HashSet()); + coll1.getCollection().add(str1); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(MulIdTestEntity.class, str2_id); + coll1 = em.find(SetRefCollEntityMulId.class, coll1_id); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(MulIdTestEntity.class, str1_id); + coll1 = em.find(SetRefCollEntityMulId.class, coll1_id); + + coll1.getCollection().remove(str1); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + coll1 = em.find(SetRefCollEntityMulId.class, coll1_id); + + coll1.getCollection().clear(); + + em.getTransaction().commit(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3, 4).equals(getVersionsReader().getRevisions(SetRefCollEntityMulId.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(MulIdTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(MulIdTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + MulIdTestEntity str1 = getEntityManager().find(MulIdTestEntity.class, str1_id); + MulIdTestEntity str2 = getEntityManager().find(MulIdTestEntity.class, str2_id); + + SetRefCollEntityMulId rev1 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 1); + SetRefCollEntityMulId rev2 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 2); + SetRefCollEntityMulId rev3 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 3); + SetRefCollEntityMulId rev4 = getVersionsReader().find(SetRefCollEntityMulId.class, coll1_id, 4); + + assert rev1.getCollection().equals(TestTools.makeSet(str1)); + assert rev2.getCollection().equals(TestTools.makeSet(str1, str2)); + assert rev3.getCollection().equals(TestTools.makeSet(str2)); + assert rev4.getCollection().equals(TestTools.makeSet()); + + assert "coll1".equals(rev1.getData()); + assert "coll1".equals(rev2.getData()); + assert "coll1".equals(rev3.getData()); + assert "coll1".equals(rev4.getData()); + } +} \ No newline at end of file Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DataChangesNotOwnedSet.java (from rev 118, trunk/src/test/org/jboss/envers/test/integration/onetomany/unidirectional/DataChangesNotOwnedSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DataChangesNotOwnedSet.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DataChangesNotOwnedSet.java 2008-08-22 16:24:06 UTC (rev 124) @@ -0,0 +1,84 @@ +package org.jboss.envers.test.integration.onetomany.detached; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.detached.SetRefCollEntity; +import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DataChangesNotOwnedSet extends AbstractEntityTest { + private Integer str1_id; + + private Integer coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrTestEntity.class); + cfg.addAnnotatedClass(SetRefCollEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + StrTestEntity str1 = new StrTestEntity("str1"); + + SetRefCollEntity coll1 = new SetRefCollEntity(3, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + + coll1.setCollection(new HashSet()); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str1 = em.find(StrTestEntity.class, str1.getId()); + coll1 = em.find(SetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().add(str1); + coll1.setData("coll2"); + + em.getTransaction().commit(); + + // + + str1_id = str1.getId(); + + coll1_id = coll1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(SetRefCollEntity.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + } + + @Test + public void testHistoryOfColl1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + + SetRefCollEntity rev1 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 1); + SetRefCollEntity rev2 = getVersionsReader().find(SetRefCollEntity.class, coll1_id, 2); + + assert rev1.getCollection().equals(TestTools.makeSet()); + assert rev2.getCollection().equals(TestTools.makeSet(str1)); + + assert "coll1".equals(rev1.getData()); + assert "coll2".equals(rev2.getData()); + } +} \ No newline at end of file Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-22 16:24:06 UTC (rev 124) @@ -5,6 +5,7 @@ import org.jboss.envers.SecondaryVersionsTables; import javax.persistence.*; +import java.util.Set; /** * @author Adam Warski (adam at warski dot org) @@ -32,6 +33,10 @@ @Transient private WorkingEntity2 we2; + @ManyToMany(mappedBy="we1s") + @Versioned + private Set we2s; + public WorkingEntity1() { } @@ -81,6 +86,14 @@ this.we2 = we2; } + public Set getWe2s() { + return we2s; + } + + public void setWe2s(Set we2s) { + this.we2s = we2s; + } + public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof WorkingEntity1)) return false; Modified: trunk/src/test/org/jboss/envers/test/working/WorkingMain.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-22 15:22:20 UTC (rev 123) +++ trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-22 16:24:06 UTC (rev 124) @@ -77,51 +77,10 @@ entityManager.getTransaction().commit(); - // Rev 2 + // entityManager.getTransaction().begin(); - we1 = entityManager.find(WorkingEntity1.class, we1.getId1()); - we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); - we2.getWe1s().add(we1); - - entityManager.getTransaction().commit(); - - // Rev 3 - entityManager.getTransaction().begin(); - - we1_2 = entityManager.find(WorkingEntity1.class, we1_2.getId1()); - we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); - we2.getWe1s().add(we1_2); - - entityManager.getTransaction().commit(); - - // Rev 4 - entityManager.getTransaction().begin(); - - we1_2 = entityManager.find(WorkingEntity1.class, we1_2.getId1()); - we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); - we2.getWe1s().remove(we1_2); - - entityManager.getTransaction().commit(); - - // Rev 5 - entityManager.getTransaction().begin(); - - we2 = entityManager.find(WorkingEntity2.class, we2.getId2()); - we2.setWe1s(null); - - entityManager.getTransaction().commit(); - - // Rev 6 - entityManager.getTransaction().begin(); - VersionsReader vr = VersionsReaderFactory.get(entityManager); - System.out.println("1 " + vr.find(WorkingEntity2.class, we2.getId2(), 1).getWe1s()); - System.out.println("2 " + vr.find(WorkingEntity2.class, we2.getId2(), 2).getWe1s()); - System.out.println("3 " + vr.find(WorkingEntity2.class, we2.getId2(), 3).getWe1s()); - System.out.println("4 " + vr.find(WorkingEntity2.class, we2.getId2(), 4).getWe1s()); - System.out.println("5 " + vr.find(WorkingEntity2.class, we2.getId2(), 5).getWe1s()); - System.out.println("6 " + vr.find(WorkingEntity2.class, we2.getId2(), 6).getWe1s()); entityManager.getTransaction().commit(); } From jboss-envers-commits at lists.jboss.org Sat Aug 23 06:59:58 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 23 Aug 2008 06:59:58 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r125 - in trunk/src: main/org/jboss/envers/configuration/metadata and 8 other directories. Message-ID: Author: adamw Date: 2008-08-23 06:59:58 -0400 (Sat, 23 Aug 2008) New Revision: 125 Added: trunk/src/main/org/jboss/envers/entities/mapper/relation/ManyToManyNotOwningMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/DetachedRelationInitializor.java Removed: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java trunk/src/main/org/jboss/envers/entities/RelationType.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java trunk/src/test/org/jboss/envers/test/working/WorkingMain.java Log: ENVERS-24: support for many-to-many bidirectional relations, without generating revision numbers Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-23 10:59:58 UTC (rev 125) @@ -31,7 +31,7 @@ public EntitiesConfigurations configure(Configuration cfg, YReflectionManager reflectionManager, GlobalConfiguration globalCfg, VersionsEntitiesConfiguration verEntCfg, Document revisionInfoXmlMapping) { - VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(globalCfg, verEntCfg); + VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(cfg, globalCfg, verEntCfg); DOMWriter writer = new DOMWriter(); // Sorting the persistent class topologically - superclass always before subclass @@ -71,10 +71,12 @@ try { cfg.addDocument(writer.write(mappingData.getMainMapping())); + // TODO //writeDocument(mappingData.getMainMapping()); for (Document additionalMapping : mappingData.getAdditionalMappings()) { cfg.addDocument(writer.write(additionalMapping)); + // TODO //writeDocument(additionalMapping); } } catch (DocumentException e) { Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-23 10:59:58 UTC (rev 125) @@ -24,6 +24,7 @@ import org.hibernate.type.*; import org.hibernate.util.StringHelper; import org.hibernate.MappingException; +import org.hibernate.cfg.Configuration; import org.hibernate.mapping.*; import org.hibernate.mapping.Collection; import org.dom4j.Element; @@ -35,10 +36,7 @@ import org.jboss.envers.configuration.VersionsEntitiesConfiguration; import org.jboss.envers.entities.mapper.*; import org.jboss.envers.entities.mapper.id.*; -import org.jboss.envers.entities.mapper.relation.ToOneIdMapper; -import org.jboss.envers.entities.mapper.relation.OneToOneNotOwningIdMapper; -import org.jboss.envers.entities.mapper.relation.OneToManyAttachedMapper; -import org.jboss.envers.entities.mapper.relation.OneToManyDetachedMapper; +import org.jboss.envers.entities.mapper.relation.*; import org.jboss.envers.tools.StringTools; import org.jboss.envers.tools.Tools; import org.jboss.envers.tools.HibernateVersion; @@ -58,6 +56,7 @@ public class VersionsMetadataGenerator { private final static Map EMPTY_STORE = Collections.emptyMap(); + private final Configuration cfg; private final GlobalConfiguration globalCfg; private final VersionsEntitiesConfiguration verEntCfg; @@ -68,7 +67,9 @@ private YLog log = YLogManager.getLogManager().getLog(VersionsMetadataGenerator.class); - public VersionsMetadataGenerator(GlobalConfiguration globalCfg, VersionsEntitiesConfiguration verEntCfg) { + public VersionsMetadataGenerator(Configuration cfg, GlobalConfiguration globalCfg, + VersionsEntitiesConfiguration verEntCfg) { + this.cfg = cfg; this.globalCfg = globalCfg; this.verEntCfg = verEntCfg; @@ -323,7 +324,7 @@ @SuppressWarnings({"unchecked"}) private void addOneToManyDetached(Property property, CompositeMapperBuilder mapper, String entityName, - EntityMappingData mappingData) { + EntityMappingData mappingData) { Collection propertyValue = (Collection) property.getValue(); ManyToOne mto = (ManyToOne) propertyValue.getElement(); @@ -346,7 +347,7 @@ String referencedPrefix = property.getName() + "_"; // Name of the entity that will be used to store the relation between the two entities. - String middleEntityName = referencingPrefix + referencedEntityName; + String middleEntityName = entityName + "_" + referencedEntityName; String versionsMiddleEntityName = verEntCfg.getVersionsEntityName(middleEntityName); String versionsMiddleTableName = verEntCfg.getVersionsTableName(middleEntityName, mto.getTable().getName()); @@ -375,9 +376,7 @@ addRevisionNumber(middleEntityId); addRevisionType(middleEntity); - // TODO storing information about this relation - //entitiesConfigurations.get(entityName).addOneToManyAttachedRelation(propertyName, owningReferencePropertyName, - // owningEntityName, ownedIdMapper); + entitiesConfigurations.get(entityName).addOneToManyDetachedRelation(property.getName(), referencedEntityName); // Adding the property mapper mapper.addComposite(property.getName(), new OneToManyDetachedMapper(verEntCfg, entityName, @@ -389,9 +388,68 @@ // TODO: ??? } + @SuppressWarnings({"unchecked"}) + private String getMappedBy(Table collectionTable, PersistentClass referencedClass) { + Iterator properties = referencedClass.getPropertyIterator(); + while (properties.hasNext()) { + Property property = properties.next(); + if (property.getValue() instanceof Collection) { + // The equality is intentional. We want to find a collection property with the same collection table. + //noinspection ObjectEquality + if (((Collection) property.getValue()).getCollectionTable() == collectionTable) { + return property.getName(); + } + } + } + + return null; + } + private void addManyToManyNotOwning(Property property, CompositeMapperBuilder mapper, String entityName, EntityMappingData mappingData) { - System.out.println("XXX"); + Collection propertyValue = (Collection) property.getValue(); + ManyToOne mto = (ManyToOne) propertyValue.getElement(); + + String referencedEntityName = mto.getReferencedEntityName(); + + EntityConfiguration configuration = entitiesConfigurations.get(entityName); + if (configuration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + entityName + "!"); + } + + EntityConfiguration referencedConfiguration = entitiesConfigurations.get(referencedEntityName); + if (referencedConfiguration == null) { + throw new MappingException("A versioned relation to a non-versioned entity " + referencedEntityName + "!"); + } + + String mappedBy = getMappedBy(propertyValue.getCollectionTable(), cfg.getClassMapping(referencedEntityName)); + if (mappedBy == null) { + throw new MappingException("Unable to read the mapped by attribute for " + property.getName()); + } + + IdMappingData referencingIdMapping = configuration.getIdMappingData(); + IdMappingData referencedIdMapping = referencedConfiguration.getIdMappingData(); + + String referencingPrefix = mappedBy + "_"; + String referencedPrefix = StringTools.getLastComponent(referencedEntityName) + "_"; + + // Name of the entity that will be used to store the relation between the two entities. + // The order is inverse, as the referenced and referencing entity names are swapped with respect to the + // name of the entity that was created on the owning side in addOneToManyDetached. + String middleEntityName = referencedEntityName + "_" + entityName; + String versionsMiddleEntityName = verEntCfg.getVersionsEntityName(middleEntityName); + + entitiesConfigurations.get(entityName).addManyToManyNotOwningRelation(property.getName(), mappedBy, + referencedEntityName); + + // Adding the property mapper + mapper.addComposite(property.getName(), new ManyToManyNotOwningMapper(verEntCfg, entityName, + referencedEntityName, property.getName(), verEntCfg.getVersionsEntityName(referencedEntityName), + versionsMiddleEntityName, referencingIdMapping.getIdMapper().prefixMappedProperties(referencingPrefix), + referencedIdMapping.getIdMapper().prefixMappedProperties(referencedPrefix), + entitiesConfigurations.get(referencedEntityName).getIdMapper())); + + // TODO } private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo, Modified: trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/EntitiesConfigurations.java 2008-08-23 10:59:58 UTC (rev 125) @@ -58,7 +58,8 @@ for (RelationDescription relDesc : entCfg.getRelationsIterator()) { // If this is an "owned" relation, checking the related entity, if it has a relation that has // a mapped-by attribute to the currently checked. If so, this is a bidirectional relation. - if (relDesc.getRelationType() == RelationType.TO_ONE) { + if (relDesc.getRelationType() == RelationType.TO_ONE || + relDesc.getRelationType() == RelationType.ONE_TO_MANY_DETACHED) { for (RelationDescription other : entitiesConfigurations.get(relDesc.getToEntityName()).getRelationsIterator()) { if (relDesc.getFromPropertyName().equals(other.getMappedByPropertyName()) && (entityName.equals(other.getToEntityName()))) { Modified: trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/EntityConfiguration.java 2008-08-23 10:59:58 UTC (rev 125) @@ -67,6 +67,17 @@ toEntityName, mappedByPropertyName, idMapper)); } + public void addOneToManyDetachedRelation(String fromPropertyName, String toEntityName) { + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationType.ONE_TO_MANY_DETACHED, + toEntityName, null, null)); + } + + public void addManyToManyNotOwningRelation(String fromPropertyName, String mappedByPropertyName, + String toEntityName) { + relations.put(fromPropertyName, new RelationDescription(fromPropertyName, RelationType.MANY_TO_MANY_NOT_OWNING, + toEntityName, mappedByPropertyName, null)); + } + public boolean isRelation(String propertyName) { return relations.get(propertyName) != null; } Modified: trunk/src/main/org/jboss/envers/entities/RelationType.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/RelationType.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/RelationType.java 2008-08-23 10:59:58 UTC (rev 125) @@ -6,5 +6,7 @@ public enum RelationType { TO_ONE, ONE_TO_ONE, - ONE_TO_MANY + ONE_TO_MANY, + ONE_TO_MANY_DETACHED, + MANY_TO_MANY_NOT_OWNING } Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/ManyToManyNotOwningMapper.java (from rev 124, trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/ManyToManyNotOwningMapper.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/ManyToManyNotOwningMapper.java 2008-08-23 10:59:58 UTC (rev 125) @@ -0,0 +1,59 @@ +package org.jboss.envers.entities.mapper.relation; + +import org.jboss.envers.entities.mapper.PropertyMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.lazy.DetachedRelationInitializor; +import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.configuration.VersionsEntitiesConfiguration; +import org.jboss.envers.configuration.VersionsConfiguration; +import org.hibernate.collection.PersistentCollection; + +import java.util.*; +import java.io.Serializable; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class ManyToManyNotOwningMapper extends AbstractOneToManyMapper implements PropertyMapper { + /** + * Name of the entity that declares the relation. + */ + private final String referencedEntityName; + + private final DetachedRelationQueryGenerator queryGenerator; + + public ManyToManyNotOwningMapper(VersionsEntitiesConfiguration verEntCfg, String referencingEntityName, + String referencedEntityName, String collectionReferencingPropertyName, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { + super(referencingEntityName, collectionReferencingPropertyName); + + this.referencedEntityName = referencedEntityName; + + queryGenerator = new DetachedRelationQueryGenerator(verEntCfg, versionsReferencedEntityName, + versionsMiddleEntityName, referencingMiddleIdMapper, referencedMiddleIdMapper, referencedIdMapper); + } + + public List mapCollectionChanges(String referencingPropertyName, + PersistentCollection newColl, + Serializable oldColl, Serializable id) { + // This is the not-owning side of the collection. + return null; + } + + public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { + // This is the not-owning side of the collection. + return false; + } + + protected Initializor getInitializator(VersionsConfiguration verCfg, + VersionsReaderImplementor versionsReader, + Class entityClass, Object primaryKey, + Number revision, Class collectionClass) { + return new DetachedRelationInitializor(verCfg, referencedEntityName, queryGenerator, + versionsReader, primaryKey, revision, collectionClass); + } +} \ No newline at end of file Property changes on: trunk/src/main/org/jboss/envers/entities/mapper/relation/ManyToManyNotOwningMapper.java ___________________________________________________________________ Name: svn:mergeinfo + Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyBidirectionalMapper.java 2008-08-23 10:59:58 UTC (rev 125) @@ -1,64 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.PropertyMapper; -import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.entities.mapper.relation.lazy.OneToManyBidirectionalInitializor; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.hibernate.collection.PersistentCollection; - -import java.util.*; -import java.io.Serializable; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyBidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { - private final String owningReferencePropertyName; - - public OneToManyBidirectionalMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { - super(owningEntityName, propertyName); - - this.owningReferencePropertyName = owningReferencePropertyName; - } - - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - return false; - } - - protected Initializor getInitializator(VersionsConfiguration verCfg, - VersionsReaderImplementor versionsReader, - Class entityClass, Object primaryKey, - Number revision, - Class collectionClass) { - return new OneToManyBidirectionalInitializor(versionsReader, entityClass, owningReferencePropertyName, primaryKey, - revision, collectionClass); - } - - public List mapCollectionChanges(String referencingPropertyName, PersistentCollection newColl, - Serializable oldColl, Serializable id) { - return null; - } -} \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java 2008-08-23 10:59:58 UTC (rev 125) @@ -3,7 +3,7 @@ import org.jboss.envers.entities.mapper.PropertyMapper; import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.entities.mapper.relation.lazy.OneToManyDetachedInitializor; +import org.jboss.envers.entities.mapper.relation.lazy.DetachedRelationInitializor; import org.jboss.envers.entities.mapper.id.IdMapper; import org.jboss.envers.reader.VersionsReaderImplementor; import org.jboss.envers.configuration.VersionsEntitiesConfiguration; @@ -37,10 +37,10 @@ private final DetachedRelationQueryGenerator queryGenerator; public OneToManyDetachedMapper(VersionsEntitiesConfiguration verEntCfg, String referencingEntityName, - String referencedEntityName, String collectionReferencingPropertyName, - String versionsReferencedEntityName, String versionsMiddleEntityName, - IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, - IdMapper referencedIdMapper) { + String referencedEntityName, String collectionReferencingPropertyName, + String versionsReferencedEntityName, String versionsMiddleEntityName, + IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, + IdMapper referencedIdMapper) { super(referencingEntityName, collectionReferencingPropertyName); this.verEntCfg = verEntCfg; @@ -115,7 +115,7 @@ VersionsReaderImplementor versionsReader, Class entityClass, Object primaryKey, Number revision, Class collectionClass) { - return new OneToManyDetachedInitializor(verCfg, referencedEntityName, queryGenerator, + return new DetachedRelationInitializor(verCfg, referencedEntityName, queryGenerator, versionsReader, primaryKey, revision, collectionClass); } } Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyUnidirectionalMapper.java 2008-08-23 10:59:58 UTC (rev 125) @@ -1,112 +0,0 @@ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.PropertyMapper; -import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.entities.mapper.relation.lazy.OneToManyUnidirectionalInitializor; -import org.jboss.envers.entities.mapper.id.IdMapper; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.jboss.envers.RevisionType; -import org.hibernate.collection.PersistentCollection; - -import java.util.*; -import java.io.Serializable; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyUnidirectionalMapper extends AbstractOneToManyMapper implements PropertyMapper { - private final VersionsEntitiesConfiguration verEntCfg; - private final String referencedEntityName; - private final String collectionReferencingPropertyName; - private final String versionsMiddleEntityName; - private final IdMapper referencingMiddleIdMapper; - private final IdMapper referencedMiddleIdMapper; - - private final UnidirectionalRelationQueryGenerator queryGenerator; - - public OneToManyUnidirectionalMapper(VersionsEntitiesConfiguration verEntCfg, String referencingEntityName, - String referencedEntityName, String collectionReferencingPropertyName, - String versionsReferencedEntityName, String versionsMiddleEntityName, - IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, - IdMapper referencedIdMapper) { - super(referencingEntityName, collectionReferencingPropertyName); - - this.verEntCfg = verEntCfg; - this.referencedEntityName = referencedEntityName; - this.collectionReferencingPropertyName = collectionReferencingPropertyName; - this.versionsMiddleEntityName = versionsMiddleEntityName; - this.referencingMiddleIdMapper = referencingMiddleIdMapper; - this.referencedMiddleIdMapper = referencedMiddleIdMapper; - - queryGenerator = new UnidirectionalRelationQueryGenerator(verEntCfg, versionsReferencedEntityName, - versionsMiddleEntityName, referencingMiddleIdMapper, referencedMiddleIdMapper, referencedIdMapper); - } - - private Collection getOldCollection(Serializable oldColl) { - if (oldColl instanceof Map) { - return ((Map) oldColl).keySet(); - } else { - return (Collection) oldColl; - } - } - - private void addCollectionChanges(List collectionChanges, Set changed, - RevisionType revisionType, Serializable id) { - for (Object changedEntity : changed) { - Map entityData = new HashMap(); - Map originalId = new HashMap(); - entityData.put(verEntCfg.getOriginalIdPropName(), originalId); - - collectionChanges.add(new PersistentCollectionChangeData(versionsMiddleEntityName, entityData)); - referencingMiddleIdMapper.mapToMapFromId(originalId, id); - referencedMiddleIdMapper.mapToMapFromEntity(originalId, changedEntity); - - entityData.put(verEntCfg.getRevisionTypePropName(), revisionType); - } - } - - @SuppressWarnings({"unchecked"}) - public List mapCollectionChanges(String referencingPropertyName, - PersistentCollection newColl, - Serializable oldColl, Serializable id) { - if (!collectionReferencingPropertyName.equals(referencingPropertyName)) { - return null; - } - - List collectionChanges = new ArrayList(); - - Collection newCollection = (Collection) newColl; - Collection oldCollection = getOldCollection(oldColl); - - Set added = new HashSet(); - if (newColl != null) { added.addAll(newCollection); } - if (oldColl != null) { added.removeAll(oldCollection); } - - addCollectionChanges(collectionChanges, added, RevisionType.ADD, id); - - Set deleted = new HashSet(); - if (oldColl != null) { deleted.addAll(oldCollection); } - if (newColl != null) { deleted.removeAll(newCollection); } - - addCollectionChanges(collectionChanges, deleted, RevisionType.DEL, id); - - return collectionChanges; - } - - @SuppressWarnings({"unchecked"}) - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - // Changes are mapped in the "mapCollectionChanges" method. - return false; - } - - protected Initializor getInitializator(VersionsConfiguration verCfg, - VersionsReaderImplementor versionsReader, - Class entityClass, Object primaryKey, - Number revision, Class collectionClass) { - return new OneToManyUnidirectionalInitializor(verCfg, referencedEntityName, queryGenerator, - versionsReader, primaryKey, revision, collectionClass); - } -} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToOneIdMapper.java 2008-08-23 10:59:58 UTC (rev 125) @@ -1,87 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.PropertyMapper; -import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.tools.reflection.ReflectionTools; -import org.jboss.envers.query.VersionsRestrictions; -import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.VersionsConfiguration; -import org.hibernate.property.Setter; -import org.hibernate.NonUniqueResultException; -import org.hibernate.collection.PersistentCollection; - -import javax.persistence.NoResultException; -import java.util.Map; -import java.util.List; -import java.io.Serializable; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToOneIdMapper implements PropertyMapper { - private String owningReferencePropertyName; - private String owningEntityName; - private String propertyName; - - public OneToOneIdMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) { - this.owningReferencePropertyName = owningReferencePropertyName; - this.owningEntityName = owningEntityName; - this.propertyName = propertyName; - } - - public boolean mapToMapFromEntity(Map data, Object newObj, Object oldObj) { - return false; - } - - public void mapToEntityFromMap(VersionsConfiguration verCfg, Object obj, Map data, Object primaryKey, VersionsReaderImplementor versionsReader, Number revision) { - if (obj == null) { - return; - } - - Class entityClass = ReflectionTools.loadClass(owningEntityName); - - Object value; - - try { - value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) - .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getSingleResult(); - } catch (NoResultException e) { - value = null; - } catch (NonUniqueResultException e) { - throw new VersionsException("Many versions results for one-to-one relationship: (" + owningEntityName + - ", " + owningReferencePropertyName + ")"); - } - - Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName); - setter.set(obj, value, null); - } - - public List mapCollectionChanges(String referencingPropertyName, - PersistentCollection newColl, - Serializable oldColl, - Serializable id) { - return null; - } -} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/UnidirectionalRelationQueryGenerator.java 2008-08-23 10:59:58 UTC (rev 125) @@ -1,93 +0,0 @@ -package org.jboss.envers.entities.mapper.relation; - -import org.jboss.envers.entities.mapper.id.QueryParameterData; -import org.jboss.envers.entities.mapper.id.IdMapper; -import org.jboss.envers.configuration.VersionsEntitiesConfiguration; -import org.jboss.envers.RevisionType; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.hibernate.Query; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class UnidirectionalRelationQueryGenerator { - private final String queryString; - private final IdMapper referencingMiddleIdMapper; - - public UnidirectionalRelationQueryGenerator(VersionsEntitiesConfiguration verEntCfg, - String versionsReferencedEntityName, String versionsMiddleEntityName, - IdMapper referencingMiddleIdMapper, IdMapper referencedMiddleIdMapper, - IdMapper referencedIdMapper) { - this.referencingMiddleIdMapper = referencingMiddleIdMapper; - - /* - * The query that we need to create: - * SELECT e FROM versionsReferencedEntity e, middleEntity ee - * WHERE - * (selecting e entities at revision :revision) - * e.revision = (SELECT max(e2.revision) FROM referencedEntity e2 - * WHERE e2.revision <= :revision AND e2.id1 = e.id1) AND - * (only entities referenced by the association) - * ee.id1 = e.id1 AND - * ee.id2 = :id2 AND - * (the association at revision :revision) - * ee.revision = (SELECT max(ee2.revision) FROM middleEntity ee2 - * WHERE ee2.revision <= :revision AND ee2.id2 = :id2 AND ee2.id1 = ee.id1) AND - * (only non-deleted entities and associations) - * ee.revision_type != DEL AND - * e.revision_type != DEL - */ - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); - String originalIdPropertyName = verEntCfg.getOriginalIdPropName(); - - StringBuilder querySB = new StringBuilder(); - querySB - .append("SELECT e FROM ").append(versionsReferencedEntityName).append(" e") - .append(", ").append(versionsMiddleEntityName).append(" ee ") - .append("WHERE ") - // e.revision = (SELECT max(e2.revision) ... - .append("e.").append(revisionPropertyPath).append(" = (SELECT max(e2.").append(revisionPropertyPath) - .append(") FROM ").append(versionsReferencedEntityName).append(" e2 ") - // e2.revision <= :revision - .append("WHERE e2.").append(revisionPropertyPath).append(" <= :revision AND ") - // e2.id1 = e.id1) - .append(referencedIdMapper.getIdsEqualQuery("e." + originalIdPropertyName, "e2." + originalIdPropertyName)) - .append(") AND ") - // ee.id1 = e.id1 - .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, - referencedIdMapper, "e." + originalIdPropertyName)) - .append(" AND ") - // ee.id2 = :id2 - .append(referencingMiddleIdMapper.getIdEqualsQuery("ee." + originalIdPropertyName, true)) - .append(" AND ") - // ee.revision = (SELECT max(ee2.revision) ... - .append("ee.").append(revisionPropertyPath).append(" = (SELECT max(ee2.").append(revisionPropertyPath) - .append(") FROM ").append(versionsMiddleEntityName).append(" ee2 ") - // ee2.revision <= :revision - .append("WHERE ee2.").append(revisionPropertyPath).append(" <= :revision AND ") - // ee2.id2 = :id2) - .append(referencingMiddleIdMapper.getIdEqualsQuery("ee2." + originalIdPropertyName, true)) - .append(" AND ") - // ee2.id1 = ee.id1) - .append(referencedMiddleIdMapper.getIdsEqualQuery("ee." + originalIdPropertyName, "ee2." + originalIdPropertyName)) - .append(") AND ") - // e.revision_type != DEL AND - .append("e.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype") - .append(" AND ") - // ee.revision_type != DEL - .append("ee.").append(verEntCfg.getRevisionTypePropName()).append(" != ").append(":delrevisiontype"); - - queryString = querySB.toString(); - } - - public Query getQuery(VersionsReaderImplementor versionsReader, Object primaryKey, Number revision) { - Query query = versionsReader.getSession().createQuery(queryString); - query.setParameter("revision", revision); - query.setParameter("delrevisiontype", RevisionType.DEL); - for (QueryParameterData paramData: referencingMiddleIdMapper.mapToQueryParametersFromId(primaryKey)) { - paramData.setParameterValue(query); - } - - return query; - } -} Copied: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/DetachedRelationInitializor.java (from rev 124, trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java) =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/DetachedRelationInitializor.java (rev 0) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/DetachedRelationInitializor.java 2008-08-23 10:59:58 UTC (rev 125) @@ -0,0 +1,55 @@ +package org.jboss.envers.entities.mapper.relation.lazy; + +import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; +import org.jboss.envers.entities.mapper.relation.DetachedRelationQueryGenerator; +import org.jboss.envers.entities.EntityInstantiator; +import org.jboss.envers.reader.VersionsReaderImplementor; +import org.jboss.envers.exception.VersionsException; +import org.jboss.envers.configuration.VersionsConfiguration; + +import java.util.Collection; +import java.util.List; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DetachedRelationInitializor implements Initializor { + private final VersionsConfiguration verCfg; + private final String entityName; + private final DetachedRelationQueryGenerator queryGenerator; + private final VersionsReaderImplementor versionsReader; + private final Object primaryKey; + private final Number revision; + private final Class collectionClass; + + public DetachedRelationInitializor(VersionsConfiguration verCfg, String entityName, + DetachedRelationQueryGenerator queryGenerator, + VersionsReaderImplementor versionsReader, Object primaryKey, + Number revision, Class collectionClass) { + this.verCfg = verCfg; + this.entityName = entityName; + this.queryGenerator = queryGenerator; + this.versionsReader = versionsReader; + this.primaryKey = primaryKey; + this.revision = revision; + this.collectionClass = collectionClass; + } + + @SuppressWarnings({"unchecked"}) + public T initialize() { + EntityInstantiator entityInstantiator = new EntityInstantiator(verCfg, versionsReader); + + List queryResult = queryGenerator.getQuery(versionsReader, primaryKey, revision).list(); + + T result; + try { + result = collectionClass.newInstance(); + } catch (Exception e) { + throw new VersionsException(e); + } + + entityInstantiator.addInstancesFromVersionsEntities(entityName, result, queryResult, revision); + + return result; + } +} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyBidirectionalInitializor.java 2008-08-23 10:59:58 UTC (rev 125) @@ -1,74 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.entities.mapper.relation.lazy; - -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.query.VersionsRestrictions; -import org.jboss.envers.exception.VersionsException; - -import java.util.Collection; -import java.util.List; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyBidirectionalInitializor implements Initializor { - private VersionsReaderImplementor versionsReader; - private Class entityClass; - private String owningReferencePropertyName; - private Object primaryKey; - private Number revision; - private Class collectionClass; - - public OneToManyBidirectionalInitializor(VersionsReaderImplementor versionsReader, Class entityClass, - String owningReferencePropertyName, Object primaryKey, Number revision, - Class collectionClass) { - this.versionsReader = versionsReader; - this.entityClass = entityClass; - this.owningReferencePropertyName = owningReferencePropertyName; - this.primaryKey = primaryKey; - this.revision = revision; - this.collectionClass = collectionClass; - } - - @SuppressWarnings({"unchecked"}) - public T initialize() { - List queryResult = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision) - .add(VersionsRestrictions.relatedIdEq(owningReferencePropertyName, primaryKey)).getResultList(); - - if (collectionClass.isAssignableFrom(queryResult.getClass())) { - return (T) queryResult; - } else { - Collection result; - try { - result = collectionClass.newInstance(); - } catch (Exception e) { - throw new VersionsException(e); - } - - result.addAll(queryResult); - - return (T) result; - } - } -} Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyUnidirectionalInitializor.java 2008-08-23 10:59:58 UTC (rev 125) @@ -1,55 +0,0 @@ -package org.jboss.envers.entities.mapper.relation.lazy; - -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.entities.mapper.relation.UnidirectionalRelationQueryGenerator; -import org.jboss.envers.entities.EntityInstantiator; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.VersionsConfiguration; - -import java.util.Collection; -import java.util.List; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyUnidirectionalInitializor implements Initializor { - private final VersionsConfiguration verCfg; - private final String entityName; - private final UnidirectionalRelationQueryGenerator queryGenerator; - private final VersionsReaderImplementor versionsReader; - private final Object primaryKey; - private final Number revision; - private final Class collectionClass; - - public OneToManyUnidirectionalInitializor(VersionsConfiguration verCfg, String entityName, - UnidirectionalRelationQueryGenerator queryGenerator, - VersionsReaderImplementor versionsReader, Object primaryKey, - Number revision, Class collectionClass) { - this.verCfg = verCfg; - this.entityName = entityName; - this.queryGenerator = queryGenerator; - this.versionsReader = versionsReader; - this.primaryKey = primaryKey; - this.revision = revision; - this.collectionClass = collectionClass; - } - - @SuppressWarnings({"unchecked"}) - public T initialize() { - EntityInstantiator entityInstantiator = new EntityInstantiator(verCfg, versionsReader); - - List queryResult = queryGenerator.getQuery(versionsReader, primaryKey, revision).list(); - - T result; - try { - result = collectionClass.newInstance(); - } catch (Exception e) { - throw new VersionsException(e); - } - - entityInstantiator.addInstancesFromVersionsEntities(entityName, result, queryResult, revision); - - return result; - } -} Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-23 10:59:58 UTC (rev 125) @@ -45,7 +45,7 @@ private VersionsConfiguration verCfg; private void generateBidirectionalCollectionChangeWorkUnits(VersionsSync verSync, EntityPersister entityPersister, - String entityName, Object[] newState, Object[] oldState) { + String entityName, Object[] newState, Object[] oldState) { // Checking if this is enabled in configuration ... if (!verCfg.getGlobalCfg().isGenerateRevisionsForCollections()) { return; @@ -73,7 +73,7 @@ Serializable id = (Serializable) idMapper.mapToIdFromEntity(newValue); verSync.addWorkUnit(new CollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, newValue)); } - + if (oldValue != null) { Serializable id = (Serializable) idMapper.mapToIdFromEntity(oldValue); verSync.addWorkUnit(new CollectionChangeWorkUnit(relDesc.getToEntityName(), verCfg, id, oldValue)); @@ -128,14 +128,22 @@ if (verCfg.getEntCfg().isVersioned(entityName)) { VersionsSync verSync = verCfg.getSyncManager().get(event.getSession()); - VersionsWorkUnit workUnit = new PersistentCollectionChangeWorkUnit(entityName, verCfg, newColl, - collectionEntry.getRole(), oldColl, event.getAffectedOwnerIdOrNull()); + PersistentCollectionChangeWorkUnit workUnit = new PersistentCollectionChangeWorkUnit(entityName, verCfg, + newColl, collectionEntry.getRole(), oldColl, event.getAffectedOwnerIdOrNull()); verSync.addWorkUnit(workUnit); if (workUnit.containsWork()) { // There are some changes: a revision needs also be generated for the collection owner verSync.addWorkUnit(new CollectionChangeWorkUnit(event.getAffectedOwnerEntityName(), verCfg, event.getAffectedOwnerIdOrNull(), event.getAffectedOwnerOrNull())); + + // Checking if this is not a bidirectional relation - then, a revision needs also be generated for + // the other side of the relation. + RelationDescription relDesc = verCfg.getEntCfg().getRelationDescription(event.getAffectedOwnerEntityName(), + workUnit.getReferencingPropertyName()); + if (relDesc.isBidirectional()) { + // TODO: we have to add a revision for each changed element of the collection + } } } } Modified: trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-23 10:59:58 UTC (rev 125) @@ -15,13 +15,14 @@ */ public class PersistentCollectionChangeWorkUnit extends AbstractVersionsWorkUnit implements VersionsWorkUnit { private final List collectionChanges; + private final String referencingPropertyName; public PersistentCollectionChangeWorkUnit(String entityName, VersionsConfiguration verCfg, PersistentCollection collection, String role, Serializable snapshot, Serializable id) { super(entityName, verCfg, null); - String referencingPropertyName = role.substring(entityName.length() + 1); + referencingPropertyName = role.substring(entityName.length() + 1); collectionChanges = verCfg.getEntCfg().get(getEntityName()).getPropertyMapper() .mapCollectionChanges(referencingPropertyName, collection, snapshot, id); @@ -44,6 +45,10 @@ } } + public String getReferencingPropertyName() { + return referencingPropertyName; + } + public KeepCheckResult check(AddWorkUnit second) { return null; } Modified: trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java 2008-08-23 10:59:58 UTC (rev 125) @@ -103,7 +103,7 @@ ed2_id = ed2.getId(); ing1_id = ing1.getId(); - ing2_id = ing1.getId(); + ing2_id = ing2.getId(); } @Test Modified: trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-23 10:59:58 UTC (rev 125) @@ -78,7 +78,7 @@ @Test public void testTableName() { assert "UNI_NAMING_TEST_versions".equals( - getCfg().getClassMapping("DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") + getCfg().getClassMapping("org.jboss.envers.test.integration.naming.DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") .getTable().getName()); } @@ -86,7 +86,7 @@ @Test public void testJoinColumnName() { Iterator columns = - getCfg().getClassMapping("DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") + getCfg().getClassMapping("org.jboss.envers.test.integration.naming..DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") .getTable().getColumnIterator(); boolean id1Found = false; Deleted: trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/test/org/jboss/envers/test/integration/naming/UnidirectionalNamingTestEntity.java 2008-08-23 10:59:58 UTC (rev 125) @@ -1,85 +0,0 @@ -package org.jboss.envers.test.integration.naming; - -import org.jboss.envers.Versioned; -import org.jboss.envers.test.entities.StrTestEntity; - -import javax.persistence.*; -import java.util.Set; - -/** - * @author Adam Warski (adam at warski dot org) - */ - at Entity -public class UnidirectionalNamingTestEntity { - @Id - private Integer id; - - @Versioned - private String data; - - @Versioned - @OneToMany - @JoinTable(name = "UNI_NAMING_TEST", - joinColumns = @JoinColumn(name = "ID_1"), - inverseJoinColumns = @JoinColumn(name = "ID_2")) - private Set collection; - - public UnidirectionalNamingTestEntity() { - } - - public UnidirectionalNamingTestEntity(Integer id, String data) { - this.id = id; - this.data = data; - } - - public UnidirectionalNamingTestEntity(String data) { - this.data = data; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public Set getCollection() { - return collection; - } - - public void setCollection(Set collection) { - this.collection = collection; - } - - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof UnidirectionalNamingTestEntity)) return false; - - UnidirectionalNamingTestEntity that = (UnidirectionalNamingTestEntity) o; - - if (data != null ? !data.equals(that.data) : that.data != null) return false; - if (id != null ? !id.equals(that.id) : that.id != null) return false; - - return true; - } - - public int hashCode() { - int result; - result = (id != null ? id.hashCode() : 0); - result = 31 * result + (data != null ? data.hashCode() : 0); - return result; - } - - public String toString() { - return "UnidirectionalNamingTestEntity(id = " + id + ", data = " + data + ")"; - } -} Modified: trunk/src/test/org/jboss/envers/test/working/WorkingMain.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-22 16:24:06 UTC (rev 124) +++ trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-23 10:59:58 UTC (rev 125) @@ -77,11 +77,28 @@ entityManager.getTransaction().commit(); + // Rev 2 + entityManager.getTransaction().begin(); + + we1_3 = entityManager.find(WorkingEntity1.class, we1_3.getId1()); + + WorkingEntity2 we2_1 = new WorkingEntity2("s2"); + we1s = new HashSet(); + we1s.add(we1_3); + we2_1.setWe1s(we1s); + entityManager.persist(we2_1); + + entityManager.getTransaction().commit(); + // entityManager.getTransaction().begin(); VersionsReader vr = VersionsReaderFactory.get(entityManager); + System.out.println("1: " + vr.find(WorkingEntity1.class, we1_3.getId1(), 1).getWe2s()); + System.out.println("2: " + vr.find(WorkingEntity1.class, we1_3.getId1(), 2).getWe2s()); + System.out.println("Revs we1_3: " + vr.getRevisions(WorkingEntity1.class, we1_3.getId1())); + entityManager.getTransaction().commit(); } } From jboss-envers-commits at lists.jboss.org Mon Aug 25 03:04:48 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Mon, 25 Aug 2008 03:04:48 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r126 - in trunk/src: main/org/jboss/envers/entities/mapper and 5 other directories. Message-ID: Author: adamw Date: 2008-08-25 03:04:48 -0400 (Mon, 25 Aug 2008) New Revision: 126 Removed: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java Log: ENVERS-24: generating revision numbers for bidirectional many-to-many relations Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-23 10:59:58 UTC (rev 125) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-25 07:04:48 UTC (rev 126) @@ -384,8 +384,6 @@ versionsMiddleEntityName, referencingIdMapping.getIdMapper().prefixMappedProperties(referencingPrefix), referencedIdMapping.getIdMapper().prefixMappedProperties(referencedPrefix), entitiesConfigurations.get(referencedEntityName).getIdMapper())); - - // TODO: ??? } @SuppressWarnings({"unchecked"}) @@ -405,8 +403,7 @@ return null; } - private void addManyToManyNotOwning(Property property, CompositeMapperBuilder mapper, String entityName, - EntityMappingData mappingData) { + private void addManyToManyNotOwning(Property property, CompositeMapperBuilder mapper, String entityName) { Collection propertyValue = (Collection) property.getValue(); ManyToOne mto = (ManyToOne) propertyValue.getElement(); @@ -448,8 +445,6 @@ versionsMiddleEntityName, referencingIdMapping.getIdMapper().prefixMappedProperties(referencingPrefix), referencedIdMapping.getIdMapper().prefixMappedProperties(referencedPrefix), entitiesConfigurations.get(referencedEntityName).getIdMapper())); - - // TODO } private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo, @@ -558,7 +553,7 @@ ((Collection) property.getValue()).isInverse()) { // only second pass if (!firstPass) { - addManyToManyNotOwning(property, currentMapper, entityName, mappingData); + addManyToManyNotOwning(property, currentMapper, entityName); } } else { String message = "Type not supported for versioning: " + propertyType.getClass().getName() + Modified: trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java 2008-08-23 10:59:58 UTC (rev 125) +++ trunk/src/main/org/jboss/envers/entities/mapper/PersistentCollectionChangeData.java 2008-08-25 07:04:48 UTC (rev 126) @@ -6,12 +6,14 @@ * @author Adam Warski (adam at warski dot org) */ public class PersistentCollectionChangeData { - private String entityName; - private Map data; + private final String entityName; + private final Map data; + private final Object obj; - public PersistentCollectionChangeData(String entityName, Map data) { + public PersistentCollectionChangeData(String entityName, Map data, Object obj) { this.entityName = entityName; this.data = data; + this.obj = obj; } public String getEntityName() { @@ -21,4 +23,8 @@ public Map getData() { return data; } + + public Object getObj() { + return obj; + } } Modified: trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java 2008-08-23 10:59:58 UTC (rev 125) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/OneToManyDetachedMapper.java 2008-08-25 07:04:48 UTC (rev 126) @@ -69,7 +69,7 @@ Map originalId = new HashMap(); entityData.put(verEntCfg.getOriginalIdPropName(), originalId); - collectionChanges.add(new PersistentCollectionChangeData(versionsMiddleEntityName, entityData)); + collectionChanges.add(new PersistentCollectionChangeData(versionsMiddleEntityName, entityData, changedEntity)); referencingMiddleIdMapper.mapToMapFromId(originalId, id); referencedMiddleIdMapper.mapToMapFromEntity(originalId, changedEntity); Deleted: trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java =================================================================== --- trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java 2008-08-23 10:59:58 UTC (rev 125) +++ trunk/src/main/org/jboss/envers/entities/mapper/relation/lazy/OneToManyDetachedInitializor.java 2008-08-25 07:04:48 UTC (rev 126) @@ -1,55 +0,0 @@ -package org.jboss.envers.entities.mapper.relation.lazy; - -import org.jboss.envers.entities.mapper.relation.lazy.proxy.Initializor; -import org.jboss.envers.entities.mapper.relation.DetachedRelationQueryGenerator; -import org.jboss.envers.entities.EntityInstantiator; -import org.jboss.envers.reader.VersionsReaderImplementor; -import org.jboss.envers.exception.VersionsException; -import org.jboss.envers.configuration.VersionsConfiguration; - -import java.util.Collection; -import java.util.List; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class OneToManyDetachedInitializor implements Initializor { - private final VersionsConfiguration verCfg; - private final String entityName; - private final DetachedRelationQueryGenerator queryGenerator; - private final VersionsReaderImplementor versionsReader; - private final Object primaryKey; - private final Number revision; - private final Class collectionClass; - - public OneToManyDetachedInitializor(VersionsConfiguration verCfg, String entityName, - DetachedRelationQueryGenerator queryGenerator, - VersionsReaderImplementor versionsReader, Object primaryKey, - Number revision, Class collectionClass) { - this.verCfg = verCfg; - this.entityName = entityName; - this.queryGenerator = queryGenerator; - this.versionsReader = versionsReader; - this.primaryKey = primaryKey; - this.revision = revision; - this.collectionClass = collectionClass; - } - - @SuppressWarnings({"unchecked"}) - public T initialize() { - EntityInstantiator entityInstantiator = new EntityInstantiator(verCfg, versionsReader); - - List queryResult = queryGenerator.getQuery(versionsReader, primaryKey, revision).list(); - - T result; - try { - result = collectionClass.newInstance(); - } catch (Exception e) { - throw new VersionsException(e); - } - - entityInstantiator.addInstancesFromVersionsEntities(entityName, result, queryResult, revision); - - return result; - } -} Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-23 10:59:58 UTC (rev 125) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-25 07:04:48 UTC (rev 126) @@ -33,6 +33,7 @@ import org.jboss.envers.synchronization.work.*; import org.jboss.envers.tools.Tools; import org.jboss.envers.entities.mapper.id.IdMapper; +import org.jboss.envers.entities.mapper.PersistentCollectionChangeData; import java.io.Serializable; @@ -121,6 +122,30 @@ } } + private void generateBidirectionalCollectionChangeWorkUnits(VersionsSync verSync, AbstractCollectionEvent event, + PersistentCollectionChangeWorkUnit workUnit) { + // Checking if this is enabled in configuration ... + if (!verCfg.getGlobalCfg().isGenerateRevisionsForCollections()) { + return; + } + + // Checking if this is not a bidirectional relation - then, a revision needs also be generated for + // the other side of the relation. + RelationDescription relDesc = verCfg.getEntCfg().getRelationDescription(event.getAffectedOwnerEntityName(), + workUnit.getReferencingPropertyName()); + String relatedEntityName = relDesc.getToEntityName(); + IdMapper relatedIdMapper = verCfg.getEntCfg().get(relatedEntityName).getIdMapper(); + + if (relDesc.isBidirectional()) { + for (PersistentCollectionChangeData changeData : workUnit.getCollectionChanges()) { + Object relatedObj = changeData.getObj(); + Serializable relatedId = (Serializable) relatedIdMapper.mapToIdFromEntity(relatedObj); + + verSync.addWorkUnit(new CollectionChangeWorkUnit(relatedEntityName, verCfg, relatedId, relatedObj)); + } + } + } + private void onCollectionAction(AbstractCollectionEvent event, PersistentCollection newColl, Serializable oldColl, CollectionEntry collectionEntry) { String entityName = event.getAffectedOwnerEntityName(); @@ -137,13 +162,7 @@ verSync.addWorkUnit(new CollectionChangeWorkUnit(event.getAffectedOwnerEntityName(), verCfg, event.getAffectedOwnerIdOrNull(), event.getAffectedOwnerOrNull())); - // Checking if this is not a bidirectional relation - then, a revision needs also be generated for - // the other side of the relation. - RelationDescription relDesc = verCfg.getEntCfg().getRelationDescription(event.getAffectedOwnerEntityName(), - workUnit.getReferencingPropertyName()); - if (relDesc.isBidirectional()) { - // TODO: we have to add a revision for each changed element of the collection - } + generateBidirectionalCollectionChangeWorkUnits(verSync, event, workUnit); } } } Modified: trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-23 10:59:58 UTC (rev 125) +++ trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-25 07:04:48 UTC (rev 126) @@ -49,6 +49,10 @@ return referencingPropertyName; } + public List getCollectionChanges() { + return collectionChanges; + } + public KeepCheckResult check(AddWorkUnit second) { return null; } Modified: trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-23 10:59:58 UTC (rev 125) +++ trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-25 07:04:48 UTC (rev 126) @@ -86,7 +86,7 @@ @Test public void testJoinColumnName() { Iterator columns = - getCfg().getClassMapping("org.jboss.envers.test.integration.naming..DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") + getCfg().getClassMapping("org.jboss.envers.test.integration.naming.DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") .getTable().getColumnIterator(); boolean id1Found = false; From jboss-envers-commits at lists.jboss.org Mon Aug 25 03:10:44 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Mon, 25 Aug 2008 03:10:44 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r127 - in trunk/src/test/org/jboss/envers/test: integration/manytomany and 1 other directory. Message-ID: Author: adamw Date: 2008-08-25 03:10:44 -0400 (Mon, 25 Aug 2008) New Revision: 127 Added: trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicList.java Modified: trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java Log: ENVERS-24: additional test Modified: trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java 2008-08-25 07:04:48 UTC (rev 126) +++ trunk/src/test/org/jboss/envers/test/entities/manytomany/ListOwnedEntity.java 2008-08-25 07:10:44 UTC (rev 127) @@ -20,7 +20,7 @@ private String data; @Versioned - @ManyToMany(mappedBy="referencing") + @ManyToMany(mappedBy="references") private List referencing; public ListOwnedEntity() { Copied: trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicList.java (from rev 125, trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicList.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/manytomany/BasicList.java 2008-08-25 07:10:44 UTC (rev 127) @@ -0,0 +1,189 @@ +package org.jboss.envers.test.integration.manytomany; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.manytomany.ListOwningEntity; +import org.jboss.envers.test.entities.manytomany.ListOwnedEntity; +import org.jboss.envers.test.tools.TestTools; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.hibernate.ejb.Ejb3Configuration; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.Collections; +import java.util.ArrayList; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class BasicList extends AbstractEntityTest { + private Integer ed1_id; + private Integer ed2_id; + + private Integer ing1_id; + private Integer ing2_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(ListOwningEntity.class); + cfg.addAnnotatedClass(ListOwnedEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + ListOwnedEntity ed1 = new ListOwnedEntity(1, "data_ed_1"); + ListOwnedEntity ed2 = new ListOwnedEntity(2, "data_ed_2"); + + ListOwningEntity ing1 = new ListOwningEntity(3, "data_ing_1"); + ListOwningEntity ing2 = new ListOwningEntity(4, "data_ing_2"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(ed1); + em.persist(ed2); + em.persist(ing1); + em.persist(ing2); + + em.getTransaction().commit(); + + // Revision 2 + + em.getTransaction().begin(); + + ing1 = em.find(ListOwningEntity.class, ing1.getId()); + ing2 = em.find(ListOwningEntity.class, ing2.getId()); + ed1 = em.find(ListOwnedEntity.class, ed1.getId()); + ed2 = em.find(ListOwnedEntity.class, ed2.getId()); + + ing1.setReferences(new ArrayList()); + ing1.getReferences().add(ed1); + + ing2.setReferences(new ArrayList()); + ing2.getReferences().add(ed1); + ing2.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + ing1 = em.find(ListOwningEntity.class, ing1.getId()); + ed2 = em.find(ListOwnedEntity.class, ed2.getId()); + ed1 = em.find(ListOwnedEntity.class, ed1.getId()); + + ing1.getReferences().add(ed2); + + em.getTransaction().commit(); + + // Revision 4 + em.getTransaction().begin(); + + ing1 = em.find(ListOwningEntity.class, ing1.getId()); + ed2 = em.find(ListOwnedEntity.class, ed2.getId()); + ed1 = em.find(ListOwnedEntity.class, ed1.getId()); + + ing1.getReferences().remove(ed1); + + em.getTransaction().commit(); + + // Revision 5 + em.getTransaction().begin(); + + ing1 = em.find(ListOwningEntity.class, ing1.getId()); + + ing1.setReferences(null); + + em.getTransaction().commit(); + + // + + ed1_id = ed1.getId(); + ed2_id = ed2.getId(); + + ing1_id = ing1.getId(); + ing2_id = ing2.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 4).equals(getVersionsReader().getRevisions(ListOwnedEntity.class, ed1_id)); + assert Arrays.asList(1, 2, 3, 5).equals(getVersionsReader().getRevisions(ListOwnedEntity.class, ed2_id)); + + assert Arrays.asList(1, 2, 3, 4, 5).equals(getVersionsReader().getRevisions(ListOwningEntity.class, ing1_id)); + assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(ListOwningEntity.class, ing2_id)); + } + + @Test + public void testHistoryOfEdId1() { + ListOwningEntity ing1 = getEntityManager().find(ListOwningEntity.class, ing1_id); + ListOwningEntity ing2 = getEntityManager().find(ListOwningEntity.class, ing2_id); + + ListOwnedEntity rev1 = getVersionsReader().find(ListOwnedEntity.class, ed1_id, 1); + ListOwnedEntity rev2 = getVersionsReader().find(ListOwnedEntity.class, ed1_id, 2); + ListOwnedEntity rev3 = getVersionsReader().find(ListOwnedEntity.class, ed1_id, 3); + ListOwnedEntity rev4 = getVersionsReader().find(ListOwnedEntity.class, ed1_id, 4); + ListOwnedEntity rev5 = getVersionsReader().find(ListOwnedEntity.class, ed1_id, 5); + + assert rev1.getReferencing().equals(Collections.EMPTY_LIST); + assert TestTools.checkList(rev2.getReferencing(), ing1, ing2); + assert TestTools.checkList(rev3.getReferencing(), ing1, ing2); + assert TestTools.checkList(rev4.getReferencing(), ing2); + assert TestTools.checkList(rev5.getReferencing(), ing2); + } + + @Test + public void testHistoryOfEdId2() { + ListOwningEntity ing1 = getEntityManager().find(ListOwningEntity.class, ing1_id); + ListOwningEntity ing2 = getEntityManager().find(ListOwningEntity.class, ing2_id); + + ListOwnedEntity rev1 = getVersionsReader().find(ListOwnedEntity.class, ed2_id, 1); + ListOwnedEntity rev2 = getVersionsReader().find(ListOwnedEntity.class, ed2_id, 2); + ListOwnedEntity rev3 = getVersionsReader().find(ListOwnedEntity.class, ed2_id, 3); + ListOwnedEntity rev4 = getVersionsReader().find(ListOwnedEntity.class, ed2_id, 4); + ListOwnedEntity rev5 = getVersionsReader().find(ListOwnedEntity.class, ed2_id, 5); + + assert rev1.getReferencing().equals(Collections.EMPTY_LIST); + assert TestTools.checkList(rev2.getReferencing(), ing2); + assert TestTools.checkList(rev3.getReferencing(), ing1, ing2); + assert TestTools.checkList(rev4.getReferencing(), ing1, ing2); + assert TestTools.checkList(rev5.getReferencing(), ing2); + } + + @Test + public void testHistoryOfEdIng1() { + ListOwnedEntity ed1 = getEntityManager().find(ListOwnedEntity.class, ed1_id); + ListOwnedEntity ed2 = getEntityManager().find(ListOwnedEntity.class, ed2_id); + + ListOwningEntity rev1 = getVersionsReader().find(ListOwningEntity.class, ing1_id, 1); + ListOwningEntity rev2 = getVersionsReader().find(ListOwningEntity.class, ing1_id, 2); + ListOwningEntity rev3 = getVersionsReader().find(ListOwningEntity.class, ing1_id, 3); + ListOwningEntity rev4 = getVersionsReader().find(ListOwningEntity.class, ing1_id, 4); + ListOwningEntity rev5 = getVersionsReader().find(ListOwningEntity.class, ing1_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_LIST); + assert TestTools.checkList(rev2.getReferences(), ed1); + assert TestTools.checkList(rev3.getReferences(), ed1, ed2); + assert TestTools.checkList(rev4.getReferences(), ed2); + assert rev5.getReferences().equals(Collections.EMPTY_LIST); + } + + @Test + public void testHistoryOfEdIng2() { + ListOwnedEntity ed1 = getEntityManager().find(ListOwnedEntity.class, ed1_id); + ListOwnedEntity ed2 = getEntityManager().find(ListOwnedEntity.class, ed2_id); + + ListOwningEntity rev1 = getVersionsReader().find(ListOwningEntity.class, ing2_id, 1); + ListOwningEntity rev2 = getVersionsReader().find(ListOwningEntity.class, ing2_id, 2); + ListOwningEntity rev3 = getVersionsReader().find(ListOwningEntity.class, ing2_id, 3); + ListOwningEntity rev4 = getVersionsReader().find(ListOwningEntity.class, ing2_id, 4); + ListOwningEntity rev5 = getVersionsReader().find(ListOwningEntity.class, ing2_id, 5); + + assert rev1.getReferences().equals(Collections.EMPTY_LIST); + assert TestTools.checkList(rev2.getReferences(), ed1, ed2); + assert TestTools.checkList(rev3.getReferences(), ed1, ed2); + assert TestTools.checkList(rev4.getReferences(), ed1, ed2); + assert TestTools.checkList(rev5.getReferences(), ed1, ed2); + } +} \ No newline at end of file From jboss-envers-commits at lists.jboss.org Mon Aug 25 03:25:19 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Mon, 25 Aug 2008 03:25:19 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r128 - in trunk/src: main/org/jboss/envers/configuration/metadata and 1 other directories. Message-ID: Author: adamw Date: 2008-08-25 03:25:19 -0400 (Mon, 25 Aug 2008) New Revision: 128 Added: trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java Log: ENVERS-31: applying patch contributed by Nicolas DC Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-25 07:10:44 UTC (rev 127) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-25 07:25:19 UTC (rev 128) @@ -47,7 +47,7 @@ PersistentClass pc = classes.next(); // Collecting information from annotations on the persistent class pc PersistentClassVersioningData versioningData = - annotationsMetadataReader.getVersioningData(pc, reflectionManager); + annotationsMetadataReader.getVersioningData(pc, reflectionManager, globalCfg); if (versioningData.isVersioned()) { pcDatas.put(pc, versioningData); Modified: trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java 2008-08-25 07:10:44 UTC (rev 127) +++ trunk/src/main/org/jboss/envers/configuration/GlobalConfiguration.java 2008-08-25 07:25:19 UTC (rev 128) @@ -4,6 +4,7 @@ /** * @author Adam Warski (adam at warski dot org) + * @author Nicolas Doroskevich */ public class GlobalConfiguration { // Should a revision be generated when a not-owned relation field changes @@ -11,6 +12,9 @@ // Should a warning, instead of an error and an exception, be logged, when an unsupported type is versioned private final boolean warnOnUnsupportedTypes; + + // Should the optimistic locking property of an entity be considered unversioned + private final boolean unversionedOptimisticLockingField; public GlobalConfiguration(Properties properties) { String generateRevisionsForCollectionsStr = properties.getProperty("org.jboss.envers.revisionOnCollectionChange", @@ -20,6 +24,10 @@ String warnOnUnsupportedTypesStr = properties.getProperty("org.jboss.envers.warnOnUnsupportedTypes", "false"); warnOnUnsupportedTypes = Boolean.parseBoolean(warnOnUnsupportedTypesStr); + + String ignoreOptimisticLockingPropertyStr = properties.getProperty("org.jboss.envers.unversionedOptimisticLockingField", + "false"); + unversionedOptimisticLockingField = Boolean.parseBoolean(ignoreOptimisticLockingPropertyStr); } public boolean isGenerateRevisionsForCollections() { @@ -29,4 +37,9 @@ public boolean isWarnOnUnsupportedTypes() { return warnOnUnsupportedTypes; } + + public boolean isUnversionedOptimisticLockingField() { + return unversionedOptimisticLockingField; + } + } Modified: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-25 07:10:44 UTC (rev 127) +++ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-08-25 07:25:19 UTC (rev 128) @@ -21,6 +21,9 @@ */ package org.jboss.envers.configuration.metadata; +import javax.persistence.Version; + +import org.jboss.envers.configuration.GlobalConfiguration; import org.jboss.envers.tools.reflection.YClass; import org.jboss.envers.tools.reflection.YProperty; import org.jboss.envers.tools.reflection.YReflectionManager; @@ -34,7 +37,8 @@ * @author Sebastian Komander */ public class AnnotationsMetadataReader { - private void addFromProperties(Iterable properties, PersistentClassVersioningData versioningData) { + private void addFromProperties(Iterable properties, PersistentClassVersioningData versioningData, + GlobalConfiguration globalCfg) { for (YProperty property : properties) { Versioned ver = property.getAnnotation(Versioned.class); if (ver != null) { @@ -46,21 +50,32 @@ Unversioned unVer = property.getAnnotation(Unversioned.class); if (unVer != null) { versioningData.unversionedProperties.add(property.getName()); + } else { + // if the optimistic locking field has to be unversioned and the current property + // is the optimistic locking field, add it to the unversioned properties list + if (globalCfg.isUnversionedOptimisticLockingField()) { + Version jpaVer = property.getAnnotation(Version.class); + if (jpaVer != null) { + versioningData.unversionedProperties.add(property.getName()); + } + } } } } - private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData versioningData) { + private void addPropertiesFromClass(YClass clazz, PersistentClassVersioningData versioningData, + GlobalConfiguration globalCfg) { YClass superclazz = clazz.getSuperclass(); if (!"java.lang.Object".equals(superclazz.getName())) { - addPropertiesFromClass(superclazz, versioningData); + addPropertiesFromClass(superclazz, versioningData, globalCfg); } - addFromProperties(clazz.getDeclaredProperties("field"), versioningData); - addFromProperties(clazz.getDeclaredProperties("property"), versioningData); + addFromProperties(clazz.getDeclaredProperties("field"), versioningData, globalCfg); + addFromProperties(clazz.getDeclaredProperties("property"), versioningData, globalCfg); } - public PersistentClassVersioningData getVersioningData(PersistentClass pc, YReflectionManager reflectionManager) { + public PersistentClassVersioningData getVersioningData(PersistentClass pc, YReflectionManager reflectionManager, + GlobalConfiguration globalCfg) { PersistentClassVersioningData versioningData = new PersistentClassVersioningData(); if (pc.getClassName() == null) { @@ -75,7 +90,7 @@ versioningData.propertyStoreInfo.defaultStore = defaultVersioned.modStore(); } - addPropertiesFromClass(clazz, versioningData); + addPropertiesFromClass(clazz, versioningData, globalCfg); VersionsTable versionsTable = clazz.getAnnotation(VersionsTable.class); if (versionsTable != null) { Added: trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingField.java 2008-08-25 07:25:19 UTC (rev 128) @@ -0,0 +1,70 @@ +package org.jboss.envers.test.integration.properties; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.Map; + +import javax.persistence.EntityManager; + +import org.hibernate.ejb.Ejb3Configuration; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Property; +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * @author Nicolas Doroskevich + */ +public class UnversionedOptimisticLockingField extends AbstractEntityTest { + private Integer id1; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(UnversionedOptimisticLockingFieldEntity.class); + + cfg.setProperty("org.jboss.envers.unversionedOptimisticLockingField", "true"); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + em.getTransaction().begin(); + UnversionedOptimisticLockingFieldEntity olfe = new UnversionedOptimisticLockingFieldEntity("x"); + em.persist(olfe); + id1 = olfe.getId(); + em.getTransaction().commit(); + + em.getTransaction().begin(); + olfe = em.find(UnversionedOptimisticLockingFieldEntity.class, id1); + olfe.setStr("y"); + em.getTransaction().commit(); + } + + @Test + public void testRevisionCounts() { + assert Arrays.asList(1, 2).equals( + getVersionsReader().getRevisions(UnversionedOptimisticLockingFieldEntity.class, + id1)); + } + + @Test + public void testHistoryOfId1() { + UnversionedOptimisticLockingFieldEntity ver1 = new UnversionedOptimisticLockingFieldEntity(id1, "x"); + UnversionedOptimisticLockingFieldEntity ver2 = new UnversionedOptimisticLockingFieldEntity(id1, "y"); + + assert getVersionsReader().find(UnversionedOptimisticLockingFieldEntity.class, id1, 1) + .equals(ver1); + assert getVersionsReader().find(UnversionedOptimisticLockingFieldEntity.class, id1, 2) + .equals(ver2); + } + + @Test + public void testMapping() { + PersistentClass pc = getCfg().getClassMapping(UnversionedOptimisticLockingFieldEntity.class.getName() + "_versions"); + Iterator pi = pc.getPropertyIterator(); + while(pi.hasNext()) { + Property p = (Property) pi.next(); + assert !"optLocking".equals(p.getName()); + } + } +} Added: trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/properties/UnversionedOptimisticLockingFieldEntity.java 2008-08-25 07:25:19 UTC (rev 128) @@ -0,0 +1,81 @@ +package org.jboss.envers.test.integration.properties; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Version; + +import org.jboss.envers.Versioned; + +/** + * @author Nicolas Doroskevich + */ + at Versioned + at Entity +public class UnversionedOptimisticLockingFieldEntity { + + @Id + @GeneratedValue + private Integer id; + + private String str; + + @Version + private int optLocking; + + public UnversionedOptimisticLockingFieldEntity() { + } + + public UnversionedOptimisticLockingFieldEntity(String str) { + this.str = str; + } + + public UnversionedOptimisticLockingFieldEntity(Integer id, String str) { + this.id = id; + this.str = str; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getStr() { + return str; + } + + public void setStr(String str) { + this.str = str; + } + + public int getOptLocking() { + return optLocking; + } + + public void setOptLocking(int optLocking) { + this.optLocking = optLocking; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof UnversionedOptimisticLockingFieldEntity)) return false; + + UnversionedOptimisticLockingFieldEntity that = (UnversionedOptimisticLockingFieldEntity) o; + + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (str != null ? !str.equals(that.str) : that.str != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (str != null ? str.hashCode() : 0); + return result; + } + +} From jboss-envers-commits at lists.jboss.org Mon Aug 25 04:53:53 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Mon, 25 Aug 2008 04:53:53 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r129 - in trunk: src/test/org/jboss/envers/test/integration/inheritance/single/childrelation and 1 other directory. Message-ID: Author: adamw Date: 2008-08-25 04:53:52 -0400 (Mon, 25 Aug 2008) New Revision: 129 Modified: trunk/lib/hibernate-3.3.0/hibernate-annotations.jar trunk/lib/hibernate-3.3.0/hibernate-commons-annotations.jar trunk/lib/hibernate-3.3.0/hibernate-entitymanager.jar trunk/lib/hibernate-3.3.0/hibernate3.jar trunk/src/test/org/jboss/envers/test/integration/inheritance/single/childrelation/ChildReferencing.java Log: ENVERS-38: hibernate core 3.3.0.SP1, entity manager and annotations 3.4.0 Modified: trunk/lib/hibernate-3.3.0/hibernate-annotations.jar =================================================================== (Binary files differ) Modified: trunk/lib/hibernate-3.3.0/hibernate-commons-annotations.jar =================================================================== (Binary files differ) Modified: trunk/lib/hibernate-3.3.0/hibernate-entitymanager.jar =================================================================== (Binary files differ) Modified: trunk/lib/hibernate-3.3.0/hibernate3.jar =================================================================== (Binary files differ) Modified: trunk/src/test/org/jboss/envers/test/integration/inheritance/single/childrelation/ChildReferencing.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/inheritance/single/childrelation/ChildReferencing.java 2008-08-25 07:25:19 UTC (rev 128) +++ trunk/src/test/org/jboss/envers/test/integration/inheritance/single/childrelation/ChildReferencing.java 2008-08-25 08:53:52 UTC (rev 129) @@ -58,7 +58,6 @@ re2 = em.find(ReferencedEntity.class, re_id2); cie = em.find(ChildIngEntity.class, c_id); - System.out.println(re2.getId()); cie.setReferenced(re2); em.getTransaction().commit(); From jboss-envers-commits at lists.jboss.org Mon Aug 25 05:32:06 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Mon, 25 Aug 2008 05:32:06 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r130 - in trunk/src: main/org/jboss/envers/event and 3 other directories. Message-ID: Author: adamw Date: 2008-08-25 05:32:06 -0400 (Mon, 25 Aug 2008) New Revision: 130 Added: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/DoubleSetRefCollEntity.java trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DoubleNotOwnedSet.java Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/event/VersionsEventListener.java trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java Log: ENVERS-26: support for multiple one-to-many detached relations, with test Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-25 08:53:52 UTC (rev 129) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-25 09:32:06 UTC (rev 130) @@ -347,7 +347,7 @@ String referencedPrefix = property.getName() + "_"; // Name of the entity that will be used to store the relation between the two entities. - String middleEntityName = entityName + "_" + referencedEntityName; + String middleEntityName = entityName + "_" + referencedEntityName + "_" + mto.getTable().getName(); String versionsMiddleEntityName = verEntCfg.getVersionsEntityName(middleEntityName); String versionsMiddleTableName = verEntCfg.getVersionsTableName(middleEntityName, mto.getTable().getName()); Modified: trunk/src/main/org/jboss/envers/event/VersionsEventListener.java =================================================================== --- trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-25 08:53:52 UTC (rev 129) +++ trunk/src/main/org/jboss/envers/event/VersionsEventListener.java 2008-08-25 09:32:06 UTC (rev 130) @@ -133,10 +133,11 @@ // the other side of the relation. RelationDescription relDesc = verCfg.getEntCfg().getRelationDescription(event.getAffectedOwnerEntityName(), workUnit.getReferencingPropertyName()); - String relatedEntityName = relDesc.getToEntityName(); - IdMapper relatedIdMapper = verCfg.getEntCfg().get(relatedEntityName).getIdMapper(); if (relDesc.isBidirectional()) { + String relatedEntityName = relDesc.getToEntityName(); + IdMapper relatedIdMapper = verCfg.getEntCfg().get(relatedEntityName).getIdMapper(); + for (PersistentCollectionChangeData changeData : workUnit.getCollectionChanges()) { Object relatedObj = changeData.getObj(); Serializable relatedId = (Serializable) relatedIdMapper.mapToIdFromEntity(relatedObj); Modified: trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-25 08:53:52 UTC (rev 129) +++ trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-25 09:32:06 UTC (rev 130) @@ -29,7 +29,7 @@ } public boolean containsWork() { - return collectionChanges == null || collectionChanges.size() != 0; + return collectionChanges != null && collectionChanges.size() != 0; } @SuppressWarnings({"unchecked"}) Copied: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/DoubleSetRefCollEntity.java (from rev 124, trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetRefCollEntity.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/DoubleSetRefCollEntity.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/DoubleSetRefCollEntity.java 2008-08-25 09:32:06 UTC (rev 130) @@ -0,0 +1,100 @@ +package org.jboss.envers.test.entities.onetomany.detached; + +import org.jboss.envers.Versioned; +import org.jboss.envers.test.entities.StrTestEntity; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.JoinTable; +import java.util.Set; + +/** + * Set collection of references entity + * @author Adam Warski (adam at warski dot org) + */ + at Entity +public class DoubleSetRefCollEntity { + @Id + private Integer id; + + @Versioned + private String data; + + @Versioned + @OneToMany + @JoinTable(name = "DOUBLE_STR_1") + private Set collection; + + @Versioned + @OneToMany + @JoinTable(name = "DOUBLE_STR_2") + private Set collection2; + + public DoubleSetRefCollEntity() { + } + + public DoubleSetRefCollEntity(Integer id, String data) { + this.id = id; + this.data = data; + } + + public DoubleSetRefCollEntity(String data) { + this.data = data; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Set getCollection() { + return collection; + } + + public void setCollection(Set collection) { + this.collection = collection; + } + + public Set getCollection2() { + return collection2; + } + + public void setCollection2(Set collection2) { + this.collection2 = collection2; + } + + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DoubleSetRefCollEntity)) return false; + + DoubleSetRefCollEntity that = (DoubleSetRefCollEntity) o; + + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (id != null ? !id.equals(that.id) : that.id != null) return false; + + return true; + } + + public int hashCode() { + int result; + result = (id != null ? id.hashCode() : 0); + result = 31 * result + (data != null ? data.hashCode() : 0); + return result; + } + + public String toString() { + return "DoubleSetRefEdEntity(id = " + id + ", data = " + data + ")"; + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/DoubleSetRefCollEntity.java ___________________________________________________________________ Name: svn:mergeinfo + Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DoubleNotOwnedSet.java (from rev 124, trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicNotOwnedSet.java) =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DoubleNotOwnedSet.java (rev 0) +++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DoubleNotOwnedSet.java 2008-08-25 09:32:06 UTC (rev 130) @@ -0,0 +1,108 @@ +package org.jboss.envers.test.integration.onetomany.detached; + +import org.jboss.envers.test.integration.AbstractEntityTest; +import org.jboss.envers.test.entities.onetomany.detached.DoubleSetRefCollEntity; +import org.jboss.envers.test.entities.StrTestEntity; +import org.jboss.envers.test.tools.TestTools; +import org.hibernate.ejb.Ejb3Configuration; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import javax.persistence.EntityManager; +import java.util.Arrays; +import java.util.HashSet; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DoubleNotOwnedSet extends AbstractEntityTest { + private Integer str1_id; + private Integer str2_id; + + private Integer coll1_id; + + public void configure(Ejb3Configuration cfg) { + cfg.addAnnotatedClass(StrTestEntity.class); + cfg.addAnnotatedClass(DoubleSetRefCollEntity.class); + } + + @BeforeClass(dependsOnMethods = "init") + public void initData() { + EntityManager em = getEntityManager(); + + StrTestEntity str1 = new StrTestEntity("str1"); + StrTestEntity str2 = new StrTestEntity("str2"); + + DoubleSetRefCollEntity coll1 = new DoubleSetRefCollEntity(3, "coll1"); + + // Revision 1 + em.getTransaction().begin(); + + em.persist(str1); + em.persist(str2); + + coll1.setCollection(new HashSet()); + coll1.getCollection().add(str1); + em.persist(coll1); + + coll1.setCollection2(new HashSet()); + coll1.getCollection2().add(str2); + em.persist(coll1); + + em.getTransaction().commit(); + + // Revision 2 + em.getTransaction().begin(); + + str2 = em.find(StrTestEntity.class, str2.getId()); + coll1 = em.find(DoubleSetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().add(str2); + + em.getTransaction().commit(); + + // Revision 3 + em.getTransaction().begin(); + + str1 = em.find(StrTestEntity.class, str1.getId()); + coll1 = em.find(DoubleSetRefCollEntity.class, coll1.getId()); + + coll1.getCollection().remove(str1); + coll1.getCollection2().add(str1); + + em.getTransaction().commit(); + + // + + str1_id = str1.getId(); + str2_id = str2.getId(); + + coll1_id = coll1.getId(); + } + + @Test + public void testRevisionsCounts() { + assert Arrays.asList(1, 2, 3).equals(getVersionsReader().getRevisions(DoubleSetRefCollEntity.class, coll1_id)); + + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id)); + assert Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id)); + } + + @Test + public void testHistoryOfColl1() { + StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id); + StrTestEntity str2 = getEntityManager().find(StrTestEntity.class, str2_id); + + DoubleSetRefCollEntity rev1 = getVersionsReader().find(DoubleSetRefCollEntity.class, coll1_id, 1); + DoubleSetRefCollEntity rev2 = getVersionsReader().find(DoubleSetRefCollEntity.class, coll1_id, 2); + DoubleSetRefCollEntity rev3 = getVersionsReader().find(DoubleSetRefCollEntity.class, coll1_id, 3); + + assert rev1.getCollection().equals(TestTools.makeSet(str1)); + assert rev2.getCollection().equals(TestTools.makeSet(str1, str2)); + assert rev3.getCollection().equals(TestTools.makeSet(str2)); + + assert rev1.getCollection2().equals(TestTools.makeSet(str2)); + assert rev2.getCollection2().equals(TestTools.makeSet(str2)); + assert rev3.getCollection2().equals(TestTools.makeSet(str1, str2)); + } +} \ No newline at end of file Property changes on: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/DoubleNotOwnedSet.java ___________________________________________________________________ Name: svn:mergeinfo + From jboss-envers-commits at lists.jboss.org Mon Aug 25 05:40:59 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Mon, 25 Aug 2008 05:40:59 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r131 - in trunk/src: test/org/jboss/envers/test/integration/naming and 1 other directory. Message-ID: Author: adamw Date: 2008-08-25 05:40:59 -0400 (Mon, 25 Aug 2008) New Revision: 131 Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java Log: ENVERS-26: fixing many-to-many relations Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-25 09:32:06 UTC (rev 130) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-25 09:40:59 UTC (rev 131) @@ -322,6 +322,10 @@ propertyName)); } + private String getMiddleEntityName(String entityName, String referencedEntityName, ManyToOne mto) { + return entityName + "_" + referencedEntityName + "_" + mto.getTable().getName(); + } + @SuppressWarnings({"unchecked"}) private void addOneToManyDetached(Property property, CompositeMapperBuilder mapper, String entityName, EntityMappingData mappingData) { @@ -347,7 +351,7 @@ String referencedPrefix = property.getName() + "_"; // Name of the entity that will be used to store the relation between the two entities. - String middleEntityName = entityName + "_" + referencedEntityName + "_" + mto.getTable().getName(); + String middleEntityName = getMiddleEntityName(entityName, referencedEntityName, mto); String versionsMiddleEntityName = verEntCfg.getVersionsEntityName(middleEntityName); String versionsMiddleTableName = verEntCfg.getVersionsTableName(middleEntityName, mto.getTable().getName()); @@ -433,7 +437,7 @@ // Name of the entity that will be used to store the relation between the two entities. // The order is inverse, as the referenced and referencing entity names are swapped with respect to the // name of the entity that was created on the owning side in addOneToManyDetached. - String middleEntityName = referencedEntityName + "_" + entityName; + String middleEntityName = getMiddleEntityName(referencedEntityName, entityName, mto); String versionsMiddleEntityName = verEntCfg.getVersionsEntityName(middleEntityName); entitiesConfigurations.get(entityName).addManyToManyNotOwningRelation(property.getName(), mappedBy, Modified: trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-25 09:32:06 UTC (rev 130) +++ trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-08-25 09:40:59 UTC (rev 131) @@ -75,19 +75,19 @@ assert "data1".equals(rev2.getData()); } + private final static String MIDDLE_VERSIONS_ENTITY_NAME = + "org.jboss.envers.test.integration.naming.DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_UNI_NAMING_TEST_versions"; @Test public void testTableName() { assert "UNI_NAMING_TEST_versions".equals( - getCfg().getClassMapping("org.jboss.envers.test.integration.naming.DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") - .getTable().getName()); + getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getName()); } @SuppressWarnings({"unchecked"}) @Test public void testJoinColumnName() { Iterator columns = - getCfg().getClassMapping("org.jboss.envers.test.integration.naming.DetachedNamingTestEntity_org.jboss.envers.test.entities.StrTestEntity_versions") - .getTable().getColumnIterator(); + getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getColumnIterator(); boolean id1Found = false; boolean id2Found = false; From jboss-envers-commits at lists.jboss.org Sat Aug 30 03:58:01 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 30 Aug 2008 03:58:01 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r132 - trunk/src/main/org/jboss/envers/synchronization. Message-ID: Author: adamw Date: 2008-08-30 03:58:01 -0400 (Sat, 30 Aug 2008) New Revision: 132 Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java Log: ENVERS-46: manual flush mode exception fix Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-25 09:40:59 UTC (rev 131) +++ trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-30 07:58:01 UTC (rev 132) @@ -24,6 +24,7 @@ import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.FlushMode; +import org.hibernate.event.EventSource; import org.jboss.envers.synchronization.work.VersionsWorkUnit; import org.jboss.envers.tools.Pair; import org.jboss.envers.revisioninfo.RevisionNumberGenerator; @@ -37,7 +38,7 @@ public class VersionsSync implements Synchronization { private final RevisionNumberGenerator revisionNumberGenerator; private final VersionsSyncManager manager; - private final Session session; + private final EventSource session; private final Transaction transaction; private final LinkedList workUnits; @@ -46,7 +47,7 @@ private Number revision; - public VersionsSync(VersionsSyncManager manager, Session session, RevisionNumberGenerator revisionNumberGenerator) { + public VersionsSync(VersionsSyncManager manager, EventSource session, RevisionNumberGenerator revisionNumberGenerator) { this.manager = manager; this.session = session; this.revisionNumberGenerator = revisionNumberGenerator; @@ -125,11 +126,14 @@ return; } + System.out.println("FLUSH MODE: " + session.getFlushMode()); + if (FlushMode.isManualFlushMode(session.getFlushMode())) { Session temporarySession = null; try { //noinspection deprecation - temporarySession = session.getSessionFactory().openSession(session.connection()); + //temporarySession = session.getSessionFactory().openSession(session.connection()); + temporarySession = session.getFactory().openTemporarySession(); executeInSession(temporarySession); Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java 2008-08-25 09:40:59 UTC (rev 131) +++ trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java 2008-08-30 07:58:01 UTC (rev 132) @@ -23,8 +23,8 @@ import org.jboss.envers.tools.ConcurrentReferenceHashMap; import org.jboss.envers.revisioninfo.RevisionNumberGenerator; -import org.hibernate.Session; import org.hibernate.Transaction; +import org.hibernate.event.EventSource; import java.util.Map; @@ -43,7 +43,7 @@ this.revisionNumberGenerator = revisionNumberGenerator; } - public VersionsSync get(Session session) { + public VersionsSync get(EventSource session) { Transaction transaction = session.getTransaction(); VersionsSync verSync = versionsSyncs.get(transaction); From jboss-envers-commits at lists.jboss.org Sat Aug 30 04:02:08 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 30 Aug 2008 04:02:08 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r133 - trunk. Message-ID: Author: adamw Date: 2008-08-30 04:02:08 -0400 (Sat, 30 Aug 2008) New Revision: 133 Modified: trunk/ trunk/build.xml Log: Small build fix - externalizing the project.version property Property changes on: trunk ___________________________________________________________________ Name: svn:ignore - target build dist doc + build.properties target build dist doc Modified: trunk/build.xml =================================================================== --- trunk/build.xml 2008-08-30 07:58:01 UTC (rev 132) +++ trunk/build.xml 2008-08-30 08:02:08 UTC (rev 133) @@ -2,8 +2,12 @@ + + + + - + @@ -136,6 +140,8 @@ @@ -145,6 +151,8 @@ @@ -154,6 +162,8 @@ @@ -166,6 +176,8 @@ @@ -182,6 +194,8 @@ From jboss-envers-commits at lists.jboss.org Sat Aug 30 04:04:19 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 30 Aug 2008 04:04:19 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r134 - trunk. Message-ID: Author: adamw Date: 2008-08-30 04:04:19 -0400 (Sat, 30 Aug 2008) New Revision: 134 Modified: trunk/build.xml Log: Small build fix - externalizing the project.version property Modified: trunk/build.xml =================================================================== --- trunk/build.xml 2008-08-30 08:02:08 UTC (rev 133) +++ trunk/build.xml 2008-08-30 08:04:19 UTC (rev 134) @@ -7,7 +7,7 @@ - + From jboss-envers-commits at lists.jboss.org Sat Aug 30 10:41:47 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sat, 30 Aug 2008 10:41:47 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r135 - in trunk/src: main/org/jboss/envers/configuration/metadata and 5 other directories. Message-ID: Author: adamw Date: 2008-08-30 10:41:47 -0400 (Sat, 30 Aug 2008) New Revision: 135 Added: trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java trunk/src/main/org/jboss/envers/synchronization/work/VersionsWorkUnit.java trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java Log: ENVERS-4: revision id as a foreign constraint Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-30 14:41:47 UTC (rev 135) @@ -88,6 +88,8 @@ if (pcDatas.size() > 0) { try { if (revisionInfoXmlMapping != null) { + // TODO + //writeDocument(revisionInfoXmlMapping); cfg.addDocument(writer.write(revisionInfoXmlMapping)); } } catch (DocumentException e) { Modified: trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-30 14:41:47 UTC (rev 135) @@ -151,7 +151,7 @@ revisionInfoEntityName = pc.getEntityName(); - revisionInfoGenerator = new CustomRevisionInfoGenerator(pc.getMappedClass(), + revisionInfoGenerator = new CustomRevisionInfoGenerator(revisionInfoEntityName, pc.getMappedClass(), revisionEntity.value(), revisionInfoTimestampName); } } @@ -160,34 +160,38 @@ Document revisionInfoXmlMapping = null; if (revisionInfoGenerator == null) { - revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoTimestampName); + revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, revisionInfoTimestampName); revisionInfoXmlMapping = generateDefaultRevisionInfoXmlMapping(); } return new RevisionInfoConfigurationResult( - new RevisionNumberGenerator(revisionInfoEntityName, revisionInfoGenerator), - revisionPropType, - revisionInfoXmlMapping, - new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdName, revisionInfoTimestampName)); + revisionInfoGenerator, revisionPropType, revisionInfoXmlMapping, + new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdName, revisionInfoTimestampName), + revisionInfoEntityName, revisionInfoIdName); } } class RevisionInfoConfigurationResult { - private final RevisionNumberGenerator revisionNumberGenerator; + private final RevisionInfoGenerator revisionInfoGenerator; private final String revisionPropType; private final Document revisionInfoXmlMapping; private final RevisionInfoQueryCreator revisionInfoQueryCreator; + private final String revisionInfoEntityName; + private final String revisionInfoIdName; - RevisionInfoConfigurationResult(RevisionNumberGenerator revisionNumberGenerator, String revisionPropType, - Document revisionInfoXmlMapping, RevisionInfoQueryCreator revisionInfoQueryCreator) { - this.revisionNumberGenerator = revisionNumberGenerator; + RevisionInfoConfigurationResult(RevisionInfoGenerator revisionInfoGenerator, String revisionPropType, + Document revisionInfoXmlMapping, RevisionInfoQueryCreator revisionInfoQueryCreator, + String revisionInfoEntityName, String revisionInfoIdName) { + this.revisionInfoGenerator = revisionInfoGenerator; this.revisionPropType = revisionPropType; this.revisionInfoXmlMapping = revisionInfoXmlMapping; this.revisionInfoQueryCreator = revisionInfoQueryCreator; + this.revisionInfoEntityName = revisionInfoEntityName; + this.revisionInfoIdName = revisionInfoIdName; } - public RevisionNumberGenerator getRevisionNumberGenerator() { - return revisionNumberGenerator; + public RevisionInfoGenerator getRevisionInfoGenerator() { + return revisionInfoGenerator; } public String getRevisionPropType() { @@ -201,4 +205,12 @@ public RevisionInfoQueryCreator getRevisionInfoQueryCreator() { return revisionInfoQueryCreator; } + + public String getRevisionInfoEntityName() { + return revisionInfoEntityName; + } + + public String getRevisionInfoIdName() { + return revisionInfoIdName; + } } \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-30 14:41:47 UTC (rev 135) @@ -66,9 +66,10 @@ YReflectionManager reflectionManager = YReflectionManager.get(cfg); RevisionInfoConfiguration revInfoCfg = new RevisionInfoConfiguration(); RevisionInfoConfigurationResult revInfoCfgResult = revInfoCfg.configure(cfg, reflectionManager); - verEntCfg = new VersionsEntitiesConfiguration(properties, revInfoCfgResult.getRevisionPropType()); + verEntCfg = new VersionsEntitiesConfiguration(properties, revInfoCfgResult.getRevisionPropType(), + revInfoCfgResult.getRevisionInfoEntityName(), revInfoCfgResult.getRevisionInfoIdName()); globalCfg = new GlobalConfiguration(properties); - versionsSyncManager = new VersionsSyncManager(revInfoCfgResult.getRevisionNumberGenerator()); + versionsSyncManager = new VersionsSyncManager(revInfoCfgResult.getRevisionInfoGenerator()); revisionInfoQueryCreator = revInfoCfgResult.getRevisionInfoQueryCreator(); entCfg = new EntitiesConfigurator().configure(cfg, reflectionManager, globalCfg, verEntCfg, revInfoCfgResult.getRevisionInfoXmlMapping()); Modified: trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-30 14:41:47 UTC (rev 135) @@ -40,9 +40,16 @@ private final String revisionTypePropName; private final String revisionTypePropType; + private final String revisionInfoEntityName; + private final String revisionInfoIdName; + private final Map customVersionsTablesNames; - public VersionsEntitiesConfiguration(Properties properties, String revisionPropType) { + public VersionsEntitiesConfiguration(Properties properties, String revisionPropType, String revisionInfoEntityName, + String revisionInfoIdName) { + this.revisionInfoEntityName = revisionInfoEntityName; + this.revisionInfoIdName = revisionInfoIdName; + versionsTablePrefix = properties.getProperty("org.jboss.envers.versionsTablePrefix", ""); versionsTableSuffix = properties.getProperty("org.jboss.envers.versionsTableSuffix", "_versions"); @@ -56,17 +63,9 @@ customVersionsTablesNames = new HashMap(); - revisionPropPath = originalIdPropName + "." + revisionPropName; + revisionPropPath = originalIdPropName + "." + revisionPropName + ".id"; } - public String getVersionsTablePrefix() { - return versionsTablePrefix; - } - - public String getVersionsTableSuffix() { - return versionsTableSuffix; - } - public String getOriginalIdPropName() { return originalIdPropName; } @@ -91,6 +90,14 @@ return revisionTypePropType; } + public String getRevisionInfoEntityName() { + return revisionInfoEntityName; + } + + public String getRevisionInfoIdName() { + return revisionInfoIdName; + } + // public void addCustomVersionsTableName(String entityName, String tableName) { @@ -100,7 +107,7 @@ // public String getVersionsEntityName(String entityName) { - return getVersionsTablePrefix() + entityName + getVersionsTableSuffix(); + return versionsTablePrefix + entityName + versionsTableSuffix; } public boolean isVersionsEntityName(String entityName) { @@ -108,14 +115,14 @@ return false; } - return entityName.endsWith(getVersionsTableSuffix()) && - entityName.startsWith(getVersionsTablePrefix()); + return entityName.endsWith(versionsTableSuffix) && + entityName.startsWith(versionsTablePrefix); } public String getVersionsTableName(String entityName, String tableName) { String customHistoryTableName = customVersionsTablesNames.get(entityName); if (customHistoryTableName == null) { - return getVersionsTablePrefix() + tableName + getVersionsTableSuffix(); + return versionsTablePrefix + tableName + versionsTableSuffix; } return customHistoryTableName; Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-30 14:41:47 UTC (rev 135) @@ -90,9 +90,13 @@ } } - private void addRevisionNumber(Element any_mapping) { - Element rev_mapping = MetadataTools.addProperty(any_mapping, verEntCfg.getRevisionPropName(), - verEntCfg.getRevisionPropType(), true); + private void addRevisionInfoRelation(Element any_mapping) { + Element rev_mapping = /*MetadataTools.addProperty(any_mapping, verEntCfg.getRevisionPropName(), + verEntCfg.getRevisionPropType(), true); */ + any_mapping.addElement("key-many-to-one"); + rev_mapping.addAttribute("name", verEntCfg.getRevisionPropName()); + rev_mapping.addAttribute("type", verEntCfg.getRevisionPropType()); + rev_mapping.addAttribute("entity-name", verEntCfg.getRevisionInfoEntityName()); MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); } @@ -377,7 +381,7 @@ middleEntityId.add((Element) idProperty.clone()); } - addRevisionNumber(middleEntityId); + addRevisionInfoRelation(middleEntityId); addRevisionType(middleEntity); entitiesConfigurations.get(entityName).addOneToManyDetachedRelation(property.getName(), referencedEntityName); @@ -661,8 +665,8 @@ orig_id_mapping.addAttribute("name", verEntCfg.getOriginalIdPropName()); - // Adding the "revision number" property - addRevisionNumber(orig_id_mapping); + // Adding a relation to the revision entity (effectively: the "revision number" property) + addRevisionInfoRelation(orig_id_mapping); return new IdMappingData(mapper, orig_id_mapping, rel_id_mapping); } Modified: trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-30 14:41:47 UTC (rev 135) @@ -29,6 +29,7 @@ import org.jboss.envers.configuration.VersionsConfiguration; import org.hibernate.criterion.Order; import org.hibernate.criterion.Property; +import org.hibernate.proxy.HibernateProxy; import java.util.List; import java.util.ArrayList; @@ -51,6 +52,21 @@ this.selectDeletedEntities = selectDeletedEntities; } + private Number getRevisionNumber(Map versionsEntity) { + VersionsEntitiesConfiguration verEntCfg = verCfg.getVerEntCfg(); + + String originalId = verEntCfg.getOriginalIdPropName(); + String revisionPropertyName = verEntCfg.getRevisionPropName(); + + Object revisionInfoObject = ((Map) versionsEntity.get(originalId)).get(revisionPropertyName); + + if (revisionInfoObject instanceof HibernateProxy) { + return (Number) ((HibernateProxy) revisionInfoObject).getHibernateLazyInitializer().getIdentifier(); + } else { + return (Number) ((Map) revisionInfoObject).get(verEntCfg.getRevisionInfoIdName()); + } + } + @SuppressWarnings({"unchecked"}) public List list() throws VersionsException { VersionsEntitiesConfiguration verEntCfg = verCfg.getVerEntCfg(); @@ -88,7 +104,7 @@ String revisionTypePropertyName = verEntCfg.getRevisionTypePropName(); for (Map versionsEntity : queryResult) { - Number revision = (Number) ((Map) versionsEntity.get(originalId)).get(revisionPropertyName); + Number revision = getRevisionNumber(versionsEntity); Object entity = entityInstantiator.createInstanceFromVersionsEntity(entityName, versionsEntity, revision); Added: trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java 2008-08-30 14:41:47 UTC (rev 135) @@ -0,0 +1,22 @@ +package org.jboss.envers.revisioninfo; + +import org.hibernate.Session; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public abstract class AbstractRevisionInfoGenerator implements RevisionInfoGenerator { + private final String revisionInfoEntityName; + + protected AbstractRevisionInfoGenerator(String revisionInfoEntityName) { + this.revisionInfoEntityName = revisionInfoEntityName; + } + + protected abstract Object newRevision(); + + public Object generate(Session session) { + Object revisionData = newRevision(); + session.save(revisionInfoEntityName, revisionData); + return revisionData; + } +} Modified: trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java 2008-08-30 14:41:47 UTC (rev 135) @@ -29,14 +29,16 @@ /** * @author Adam Warski (adam at warski dot org) */ -public class CustomRevisionInfoGenerator implements RevisionInfoGenerator { +public class CustomRevisionInfoGenerator extends AbstractRevisionInfoGenerator implements RevisionInfoGenerator { private final RevisionListener listener; private final Setter revisionTimestampSetter; private final Class entityClass; - public CustomRevisionInfoGenerator(Class entityClass, + public CustomRevisionInfoGenerator(String revisionInfoEntityName, Class entityClass, Class listenerClass, String revisionInfoTimestampName) { + super(revisionInfoEntityName); + this.entityClass = entityClass; revisionTimestampSetter = ReflectionTools.getSetter(entityClass, revisionInfoTimestampName); Modified: trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-30 14:41:47 UTC (rev 135) @@ -27,10 +27,12 @@ /** * @author Adam Warski (adam at warski dot org) */ -public class DefaultRevisionInfoGenerator implements RevisionInfoGenerator { +public class DefaultRevisionInfoGenerator extends AbstractRevisionInfoGenerator implements RevisionInfoGenerator { private final String revisionInfoTimestampName; - public DefaultRevisionInfoGenerator(String revisionInfoTimestampName) { + public DefaultRevisionInfoGenerator(String revisionInfoEntityName, String revisionInfoTimestampName) { + super(revisionInfoEntityName); + this.revisionInfoTimestampName = revisionInfoTimestampName; } Modified: trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoGenerator.java 2008-08-30 14:41:47 UTC (rev 135) @@ -21,9 +21,11 @@ */ package org.jboss.envers.revisioninfo; +import org.hibernate.Session; + /** * @author Adam Warski (adam at warski dot org) */ public interface RevisionInfoGenerator { - public Object newRevision(); + Object generate(Session session); } Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/VersionsSync.java 2008-08-30 14:41:47 UTC (rev 135) @@ -27,7 +27,7 @@ import org.hibernate.event.EventSource; import org.jboss.envers.synchronization.work.VersionsWorkUnit; import org.jboss.envers.tools.Pair; -import org.jboss.envers.revisioninfo.RevisionNumberGenerator; +import org.jboss.envers.revisioninfo.RevisionInfoGenerator; import javax.transaction.Synchronization; import java.util.*; @@ -36,7 +36,7 @@ * @author Adam Warski (adam at warski dot org) */ public class VersionsSync implements Synchronization { - private final RevisionNumberGenerator revisionNumberGenerator; + private final RevisionInfoGenerator revisionInfoGenerator; private final VersionsSyncManager manager; private final EventSource session; @@ -45,12 +45,12 @@ private final Queue undoQueue; private final Map, VersionsWorkUnit> usedIds; - private Number revision; + private Object revisionData; - public VersionsSync(VersionsSyncManager manager, EventSource session, RevisionNumberGenerator revisionNumberGenerator) { + public VersionsSync(VersionsSyncManager manager, EventSource session, RevisionInfoGenerator revisionInfoGenerator) { this.manager = manager; this.session = session; - this.revisionNumberGenerator = revisionNumberGenerator; + this.revisionInfoGenerator = revisionInfoGenerator; transaction = session.getTransaction(); workUnits = new LinkedList(); @@ -105,8 +105,8 @@ } private void executeInSession(Session session) { - if (revision == null) { - revision = revisionNumberGenerator.generate(session); + if (revisionData == null) { + revisionData = revisionInfoGenerator.generate(session); } VersionsWorkUnit vwu; @@ -117,7 +117,7 @@ } while ((vwu = workUnits.poll()) != null) { - vwu.perform(session, revision); + vwu.perform(session, revisionData); } } @@ -126,8 +126,6 @@ return; } - System.out.println("FLUSH MODE: " + session.getFlushMode()); - if (FlushMode.isManualFlushMode(session.getFlushMode())) { Session temporarySession = null; try { Modified: trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/VersionsSyncManager.java 2008-08-30 14:41:47 UTC (rev 135) @@ -22,7 +22,7 @@ package org.jboss.envers.synchronization; import org.jboss.envers.tools.ConcurrentReferenceHashMap; -import org.jboss.envers.revisioninfo.RevisionNumberGenerator; +import org.jboss.envers.revisioninfo.RevisionInfoGenerator; import org.hibernate.Transaction; import org.hibernate.event.EventSource; @@ -33,14 +33,14 @@ */ public class VersionsSyncManager { private final Map versionsSyncs; - private final RevisionNumberGenerator revisionNumberGenerator; + private final RevisionInfoGenerator revisionInfoGenerator; - public VersionsSyncManager(RevisionNumberGenerator revisionNumberGenerator) { + public VersionsSyncManager(RevisionInfoGenerator revisionInfoGenerator) { versionsSyncs = new ConcurrentReferenceHashMap(10, ConcurrentReferenceHashMap.ReferenceType.WEAK, ConcurrentReferenceHashMap.ReferenceType.STRONG); - this.revisionNumberGenerator = revisionNumberGenerator; + this.revisionInfoGenerator = revisionInfoGenerator; } public VersionsSync get(EventSource session) { @@ -48,7 +48,7 @@ VersionsSync verSync = versionsSyncs.get(transaction); if (verSync == null) { - verSync = new VersionsSync(this, session, revisionNumberGenerator); + verSync = new VersionsSync(this, session, revisionInfoGenerator); versionsSyncs.put(transaction, verSync); transaction.registerSynchronization(verSync); Modified: trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/work/AbstractVersionsWorkUnit.java 2008-08-30 14:41:47 UTC (rev 135) @@ -47,7 +47,7 @@ this.entityName = entityName; } - protected void fillDataWithId(Map data, Number revision, RevisionType revisionType) { + protected void fillDataWithId(Map data, Object revision, RevisionType revisionType) { VersionsEntitiesConfiguration entitiesCfg = verCfg.getVerEntCfg(); Map originalId = new HashMap(); Modified: trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/work/AddWorkUnit.java 2008-08-30 14:41:47 UTC (rev 135) @@ -49,9 +49,9 @@ return true; } - public void perform(Session session, Number revision) { + public void perform(Session session, Object revisionData) { Map data = new HashMap(); - fillDataWithId(data, revision, RevisionType.ADD); + fillDataWithId(data, revisionData, RevisionType.ADD); verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().map(data, propertyNames, state, null); Modified: trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/work/CollectionChangeWorkUnit.java 2008-08-30 14:41:47 UTC (rev 135) @@ -45,9 +45,9 @@ return true; } - public void perform(Session session, Number revision) { + public void perform(Session session, Object revisionData) { Map data = new HashMap(); - fillDataWithId(data, revision, RevisionType.MOD); + fillDataWithId(data, revisionData, RevisionType.MOD); verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().mapToMapFromEntity(data, entity, null); Modified: trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/work/DelWorkUnit.java 2008-08-30 14:41:47 UTC (rev 135) @@ -41,9 +41,9 @@ return true; } - public void perform(Session session, Number revision) { + public void perform(Session session, Object revisionData) { Map data = new HashMap(); - fillDataWithId(data, revision, RevisionType.DEL); + fillDataWithId(data, revisionData, RevisionType.DEL); session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); Modified: trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/work/ModWorkUnit.java 2008-08-30 14:41:47 UTC (rev 135) @@ -50,8 +50,8 @@ return changes; } - public void perform(Session session, Number revision) { - fillDataWithId(data, revision, RevisionType.MOD); + public void perform(Session session, Object revisionData) { + fillDataWithId(data, revisionData, RevisionType.MOD); session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data); Modified: trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java 2008-08-30 14:41:47 UTC (rev 135) @@ -33,13 +33,13 @@ } @SuppressWarnings({"unchecked"}) - public void perform(Session session, Number revision) { + public void perform(Session session, Object revisionData) { VersionsEntitiesConfiguration entitiesCfg = verCfg.getVerEntCfg(); for (PersistentCollectionChangeData persistentCollectionChangeData : collectionChanges) { // Setting the revision number ((Map) persistentCollectionChangeData.getData().get(entitiesCfg.getOriginalIdPropName())) - .put(entitiesCfg.getRevisionPropName(), revision); + .put(entitiesCfg.getRevisionPropName(), revisionData); session.save(persistentCollectionChangeData.getEntityName(), persistentCollectionChangeData.getData()); } Modified: trunk/src/main/org/jboss/envers/synchronization/work/VersionsWorkUnit.java =================================================================== --- trunk/src/main/org/jboss/envers/synchronization/work/VersionsWorkUnit.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/main/org/jboss/envers/synchronization/work/VersionsWorkUnit.java 2008-08-30 14:41:47 UTC (rev 135) @@ -34,6 +34,6 @@ boolean isPerformed(); - void perform(Session session, Number revision); + void perform(Session session, Object revisionData); void undo(Session session); } Modified: trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java =================================================================== --- trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java 2008-08-30 08:04:19 UTC (rev 134) +++ trunk/src/test/org/jboss/envers/test/integration/query/DeletedEntities.java 2008-08-30 14:41:47 UTC (rev 135) @@ -2,10 +2,7 @@ import org.jboss.envers.test.integration.AbstractEntityTest; import org.jboss.envers.test.entities.StrIntTestEntity; -import org.jboss.envers.test.tools.TestTools; import org.jboss.envers.query.VersionsRestrictions; -import org.jboss.envers.query.RevisionProperty; -import org.jboss.envers.query.RevisionTypeProperty; import org.jboss.envers.RevisionType; import org.hibernate.ejb.Ejb3Configuration; import org.hibernate.criterion.Projections; @@ -14,14 +11,11 @@ import javax.persistence.EntityManager; import java.util.List; -import java.util.HashSet; -import java.util.Arrays; /** * @author Adam Warski (adam at warski dot org) */ public class DeletedEntities extends AbstractEntityTest { - private Integer id1; private Integer id2; public void configure(Ejb3Configuration cfg) { @@ -40,7 +34,6 @@ em.persist(site1); em.persist(site2); - id1 = site1.getId(); id2 = site2.getId(); em.getTransaction().commit(); From jboss-envers-commits at lists.jboss.org Sun Aug 31 04:46:37 2008 From: jboss-envers-commits at lists.jboss.org (jboss-envers-commits at lists.jboss.org) Date: Sun, 31 Aug 2008 04:46:37 -0400 Subject: [jboss-envers-commits] JBoss Envers SVN: r136 - in trunk/src: main/org/jboss/envers/configuration/metadata and 3 other directories. Message-ID: Author: adamw Date: 2008-08-31 04:46:36 -0400 (Sun, 31 Aug 2008) New Revision: 136 Added: trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoNumberReader.java Removed: trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java trunk/src/test/org/jboss/envers/test/working/WorkingMain.java Log: ENVERS-47: revision info always mapped to a class, not as a dynamic model when a custom revision entity is missing Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-08-31 08:46:36 UTC (rev 136) @@ -1,3 +1,24 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ package org.jboss.envers.configuration; import org.jboss.envers.entities.EntitiesConfigurations; @@ -12,6 +33,7 @@ import org.dom4j.io.OutputFormat; import org.dom4j.Document; import org.dom4j.DocumentException; +import org.dom4j.Element; import org.hibernate.mapping.PersistentClass; import org.hibernate.MappingException; import org.hibernate.cfg.Configuration; @@ -30,8 +52,9 @@ public class EntitiesConfigurator { public EntitiesConfigurations configure(Configuration cfg, YReflectionManager reflectionManager, GlobalConfiguration globalCfg, VersionsEntitiesConfiguration verEntCfg, - Document revisionInfoXmlMapping) { - VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(cfg, globalCfg, verEntCfg); + Document revisionInfoXmlMapping, Element revisionInfoRelationMapping) { + VersionsMetadataGenerator versionsMetaGen = new VersionsMetadataGenerator(cfg, globalCfg, verEntCfg, + revisionInfoRelationMapping); DOMWriter writer = new DOMWriter(); // Sorting the persistent class topologically - superclass always before subclass Modified: trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/configuration/RevisionInfoConfiguration.java 2008-08-31 08:46:36 UTC (rev 136) @@ -4,10 +4,7 @@ import org.jboss.envers.tools.reflection.YReflectionManager; import org.jboss.envers.tools.reflection.YProperty; import org.jboss.envers.tools.MutableBoolean; -import org.jboss.envers.RevisionNumber; -import org.jboss.envers.RevisionTimestamp; -import org.jboss.envers.RevisionEntity; -import org.jboss.envers.Versioned; +import org.jboss.envers.*; import org.jboss.envers.configuration.metadata.MetadataTools; import org.jboss.envers.revisioninfo.*; import org.hibernate.MappingException; @@ -31,9 +28,9 @@ private String revisionPropType; public RevisionInfoConfiguration() { - revisionInfoEntityName = "_revisions_info"; - revisionInfoIdName = "revision_id"; - revisionInfoTimestampName = "revision_timestamp"; + revisionInfoEntityName = "org.jboss.envers.DefaultRevisionEntity"; + revisionInfoIdName = "id"; + revisionInfoTimestampName = "timestamp"; revisionInfoTimestampType = "long"; revisionPropType = "integer"; @@ -42,18 +39,31 @@ private Document generateDefaultRevisionInfoXmlMapping() { Document document = DocumentHelper.createDocument(); - Element class_mapping = MetadataTools.createEntity(document, revisionInfoEntityName, - null, null, null, null); + Element class_mapping = MetadataTools.createEntity(document, null, null, null, null, null); - MetadataTools.addNativelyGeneratedId(class_mapping, revisionInfoIdName, + class_mapping.addAttribute("name", revisionInfoEntityName); + class_mapping.addAttribute("table", "_revisions_info"); + + Element idProperty = MetadataTools.addNativelyGeneratedId(class_mapping, revisionInfoIdName, revisionPropType); + MetadataTools.addColumn(idProperty, "revision_id", null); - MetadataTools.addProperty(class_mapping, revisionInfoTimestampName, + Element timestampProperty = MetadataTools.addProperty(class_mapping, revisionInfoTimestampName, revisionInfoTimestampType, false); + MetadataTools.addColumn(timestampProperty, "revision_timestamp", null); return document; } + private Element generateRevisionInfoRelationMapping() { + Document document = DocumentHelper.createDocument(); + Element rev_rel_mapping =document.addElement("key-many-to-one"); + rev_rel_mapping.addAttribute("type", revisionPropType); + rev_rel_mapping.addAttribute("class", revisionInfoEntityName); + + return rev_rel_mapping; + } + private void searchForRevisionInfoCfg(YClass clazz, YReflectionManager reflectionManager, MutableBoolean revisionNumberFound, MutableBoolean revisionTimestampFound) { YClass superclazz = clazz.getSuperclass(); @@ -112,6 +122,8 @@ boolean revisionEntityFound = false; RevisionInfoGenerator revisionInfoGenerator = null; + Class revisionInfoClass = null; + while (classes.hasNext()) { PersistentClass pc = classes.next(); YClass clazz; @@ -151,7 +163,8 @@ revisionInfoEntityName = pc.getEntityName(); - revisionInfoGenerator = new CustomRevisionInfoGenerator(revisionInfoEntityName, pc.getMappedClass(), + revisionInfoClass = pc.getMappedClass(); + revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, pc.getMappedClass(), revisionEntity.value(), revisionInfoTimestampName); } } @@ -160,14 +173,19 @@ Document revisionInfoXmlMapping = null; if (revisionInfoGenerator == null) { - revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, revisionInfoTimestampName); + // TODO - remove default + //revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, revisionInfoTimestampName); + revisionInfoClass = DefaultRevisionEntity.class; + revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, DefaultRevisionEntity.class, + RevisionListener.class, revisionInfoTimestampName); revisionInfoXmlMapping = generateDefaultRevisionInfoXmlMapping(); } return new RevisionInfoConfigurationResult( revisionInfoGenerator, revisionPropType, revisionInfoXmlMapping, new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdName, revisionInfoTimestampName), - revisionInfoEntityName, revisionInfoIdName); + generateRevisionInfoRelationMapping(), revisionInfoIdName, + new RevisionInfoNumberReader(revisionInfoClass, revisionInfoIdName)); } } @@ -176,18 +194,22 @@ private final String revisionPropType; private final Document revisionInfoXmlMapping; private final RevisionInfoQueryCreator revisionInfoQueryCreator; - private final String revisionInfoEntityName; + private final Element revisionInfoRelationMapping; + // TODO - remove ? private final String revisionInfoIdName; + private final RevisionInfoNumberReader revisionInfoNumberReader; RevisionInfoConfigurationResult(RevisionInfoGenerator revisionInfoGenerator, String revisionPropType, Document revisionInfoXmlMapping, RevisionInfoQueryCreator revisionInfoQueryCreator, - String revisionInfoEntityName, String revisionInfoIdName) { + Element revisionInfoRelationMapping, String revisionInfoIdName, + RevisionInfoNumberReader revisionInfoNumberReader) { this.revisionInfoGenerator = revisionInfoGenerator; this.revisionPropType = revisionPropType; this.revisionInfoXmlMapping = revisionInfoXmlMapping; this.revisionInfoQueryCreator = revisionInfoQueryCreator; - this.revisionInfoEntityName = revisionInfoEntityName; + this.revisionInfoRelationMapping = revisionInfoRelationMapping; this.revisionInfoIdName = revisionInfoIdName; + this.revisionInfoNumberReader = revisionInfoNumberReader; } public RevisionInfoGenerator getRevisionInfoGenerator() { @@ -206,11 +228,15 @@ return revisionInfoQueryCreator; } - public String getRevisionInfoEntityName() { - return revisionInfoEntityName; + public Element getRevisionInfoRelationMapping() { + return revisionInfoRelationMapping; } public String getRevisionInfoIdName() { return revisionInfoIdName; } + + public RevisionInfoNumberReader getRevisionInfoNumberReader() { + return revisionInfoNumberReader; + } } \ No newline at end of file Modified: trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/configuration/VersionsConfiguration.java 2008-08-31 08:46:36 UTC (rev 136) @@ -26,6 +26,7 @@ import org.jboss.envers.synchronization.VersionsSyncManager; import org.jboss.envers.tools.reflection.YReflectionManager; import org.jboss.envers.revisioninfo.RevisionInfoQueryCreator; +import org.jboss.envers.revisioninfo.RevisionInfoNumberReader; import java.util.*; @@ -38,6 +39,7 @@ private final VersionsSyncManager versionsSyncManager; private final EntitiesConfigurations entCfg; private final RevisionInfoQueryCreator revisionInfoQueryCreator; + private final RevisionInfoNumberReader revisionInfoNumberReader; public VersionsEntitiesConfiguration getVerEntCfg() { return verEntCfg; @@ -59,6 +61,10 @@ return revisionInfoQueryCreator; } + public RevisionInfoNumberReader getRevisionInfoNumberReader() { + return revisionInfoNumberReader; + } + @SuppressWarnings({"unchecked"}) public VersionsConfiguration(Configuration cfg) { Properties properties = cfg.getProperties(); @@ -67,12 +73,13 @@ RevisionInfoConfiguration revInfoCfg = new RevisionInfoConfiguration(); RevisionInfoConfigurationResult revInfoCfgResult = revInfoCfg.configure(cfg, reflectionManager); verEntCfg = new VersionsEntitiesConfiguration(properties, revInfoCfgResult.getRevisionPropType(), - revInfoCfgResult.getRevisionInfoEntityName(), revInfoCfgResult.getRevisionInfoIdName()); + revInfoCfgResult.getRevisionInfoIdName()); globalCfg = new GlobalConfiguration(properties); versionsSyncManager = new VersionsSyncManager(revInfoCfgResult.getRevisionInfoGenerator()); revisionInfoQueryCreator = revInfoCfgResult.getRevisionInfoQueryCreator(); + revisionInfoNumberReader = revInfoCfgResult.getRevisionInfoNumberReader(); entCfg = new EntitiesConfigurator().configure(cfg, reflectionManager, globalCfg, verEntCfg, - revInfoCfgResult.getRevisionInfoXmlMapping()); + revInfoCfgResult.getRevisionInfoXmlMapping(), revInfoCfgResult.getRevisionInfoRelationMapping()); } // Modified: trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/configuration/VersionsEntitiesConfiguration.java 2008-08-31 08:46:36 UTC (rev 136) @@ -37,17 +37,16 @@ private final String revisionPropType; private final String revisionPropPath; + private final String revisionEntityPath; + private final String revisionTypePropName; private final String revisionTypePropType; - private final String revisionInfoEntityName; private final String revisionInfoIdName; private final Map customVersionsTablesNames; - public VersionsEntitiesConfiguration(Properties properties, String revisionPropType, String revisionInfoEntityName, - String revisionInfoIdName) { - this.revisionInfoEntityName = revisionInfoEntityName; + public VersionsEntitiesConfiguration(Properties properties, String revisionPropType, String revisionInfoIdName) { this.revisionInfoIdName = revisionInfoIdName; versionsTablePrefix = properties.getProperty("org.jboss.envers.versionsTablePrefix", ""); @@ -63,7 +62,8 @@ customVersionsTablesNames = new HashMap(); - revisionPropPath = originalIdPropName + "." + revisionPropName + ".id"; + revisionEntityPath = originalIdPropName + "." + revisionPropName; + revisionPropPath = revisionEntityPath + ".id"; } public String getOriginalIdPropName() { @@ -90,14 +90,14 @@ return revisionTypePropType; } - public String getRevisionInfoEntityName() { - return revisionInfoEntityName; - } - public String getRevisionInfoIdName() { return revisionInfoIdName; } + public String getRevisionEntityPath() { + return revisionEntityPath; + } + // public void addCustomVersionsTableName(String entityName, String tableName) { Modified: trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-08-31 08:46:36 UTC (rev 136) @@ -70,8 +70,11 @@ hibernate_mapping.addAttribute("auto-import", "false"); Element class_mapping = hibernate_mapping.addElement(type); - class_mapping.addAttribute("entity-name", entityName); + if (entityName != null) { + class_mapping.addAttribute("entity-name", entityName); + } + if (discriminatorValue != null) { class_mapping.addAttribute("discriminator-value", discriminatorValue); } Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-08-31 08:46:36 UTC (rev 136) @@ -59,6 +59,7 @@ private final Configuration cfg; private final GlobalConfiguration globalCfg; private final VersionsEntitiesConfiguration verEntCfg; + private final Element revisionInfoRelationMapping; private Map entitiesConfigurations; @@ -68,10 +69,12 @@ private YLog log = YLogManager.getLogManager().getLog(VersionsMetadataGenerator.class); public VersionsMetadataGenerator(Configuration cfg, GlobalConfiguration globalCfg, - VersionsEntitiesConfiguration verEntCfg) { + VersionsEntitiesConfiguration verEntCfg, + Element revisionInfoRelationMapping) { this.cfg = cfg; this.globalCfg = globalCfg; this.verEntCfg = verEntCfg; + this.revisionInfoRelationMapping = revisionInfoRelationMapping; entitiesConfigurations = new HashMap(); entitiesJoins = new HashMap>(); @@ -91,13 +94,11 @@ } private void addRevisionInfoRelation(Element any_mapping) { - Element rev_mapping = /*MetadataTools.addProperty(any_mapping, verEntCfg.getRevisionPropName(), - verEntCfg.getRevisionPropType(), true); */ - any_mapping.addElement("key-many-to-one"); + Element rev_mapping = (Element) revisionInfoRelationMapping.clone(); rev_mapping.addAttribute("name", verEntCfg.getRevisionPropName()); - rev_mapping.addAttribute("type", verEntCfg.getRevisionPropType()); - rev_mapping.addAttribute("entity-name", verEntCfg.getRevisionInfoEntityName()); MetadataTools.addColumn(rev_mapping, verEntCfg.getRevisionPropName(), null); + + any_mapping.add(rev_mapping); } private void addRevisionType(Element any_mapping) { Modified: trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java =================================================================== --- trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/query/impl/RevisionsOfEntityQuery.java 2008-08-31 08:46:36 UTC (rev 136) @@ -63,7 +63,8 @@ if (revisionInfoObject instanceof HibernateProxy) { return (Number) ((HibernateProxy) revisionInfoObject).getHibernateLazyInitializer().getIdentifier(); } else { - return (Number) ((Map) revisionInfoObject).get(verEntCfg.getRevisionInfoIdName()); + // Not a proxy - must be read from cache or with a join + return verCfg.getRevisionInfoNumberReader().getRevisionNumber(revisionInfoObject); } } @@ -76,10 +77,8 @@ SELECT e (unless another projection is specified) FROM ent_ver e WHERE e.revision_type != DEL AND (if selectDeletedEntities == false) (all specified conditions, transformed, on the "e" entity) - ORDER BY e.revision ASC (unless another order is specified) - */ - String revisionPropertyPath = verEntCfg.getRevisionPropPath(); - + ORDER BY e.revision ASC (unless another order or projection is specified) + */ if (!selectDeletedEntities) { // e.revision_type != DEL AND versionsCriteria.add(Property.forName(verEntCfg.getRevisionTypePropName()).ne(RevisionType.DEL)); @@ -91,16 +90,21 @@ } if (!hasProjection && !hasOrder) { + String revisionPropertyPath = verEntCfg.getRevisionPropPath(); versionsCriteria.addOrder(Order.asc(revisionPropertyPath)); } + // TODO + if (!selectEntitiesOnly) { + //versionsCriteria.setFetchMode("e._revision", FetchMode.JOIN); + //versionsCriteria.createCriteria("e.originalId._revision").add(Property.forName("revision_id").eq(1)); + } + List queryResult = versionsCriteria.list(); if (hasProjection) { return queryResult; } else { List entities = new ArrayList(); - String originalId = verEntCfg.getOriginalIdPropName(); - String revisionPropertyName = verEntCfg.getRevisionPropName(); String revisionTypePropertyName = verEntCfg.getRevisionTypePropName(); for (Map versionsEntity : queryResult) { Deleted: trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/revisioninfo/AbstractRevisionInfoGenerator.java 2008-08-31 08:46:36 UTC (rev 136) @@ -1,22 +0,0 @@ -package org.jboss.envers.revisioninfo; - -import org.hibernate.Session; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public abstract class AbstractRevisionInfoGenerator implements RevisionInfoGenerator { - private final String revisionInfoEntityName; - - protected AbstractRevisionInfoGenerator(String revisionInfoEntityName) { - this.revisionInfoEntityName = revisionInfoEntityName; - } - - protected abstract Object newRevision(); - - public Object generate(Session session) { - Object revisionData = newRevision(); - session.save(revisionInfoEntityName, revisionData); - return revisionData; - } -} Deleted: trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java 2008-08-31 08:46:36 UTC (rev 136) @@ -1,77 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.revisioninfo; - -import org.jboss.envers.RevisionListener; -import org.jboss.envers.tools.reflection.ReflectionTools; -import org.hibernate.MappingException; -import org.hibernate.property.Setter; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class CustomRevisionInfoGenerator extends AbstractRevisionInfoGenerator implements RevisionInfoGenerator { - private final RevisionListener listener; - private final Setter revisionTimestampSetter; - private final Class entityClass; - - public CustomRevisionInfoGenerator(String revisionInfoEntityName, Class entityClass, - Class listenerClass, - String revisionInfoTimestampName) { - super(revisionInfoEntityName); - - this.entityClass = entityClass; - - revisionTimestampSetter = ReflectionTools.getSetter(entityClass, revisionInfoTimestampName); - - if (!listenerClass.equals(RevisionListener.class)) { - // This is not the default value. - try { - listener = listenerClass.newInstance(); - } catch (InstantiationException e) { - throw new MappingException(e); - } catch (IllegalAccessException e) { - throw new MappingException(e); - } - } else { - // Default listener - none - listener = null; - } - } - - public Object newRevision() { - Object entity; - try { - entity = entityClass.newInstance(); - } catch (Exception e) { - throw new RuntimeException(e); - } - - revisionTimestampSetter.set(entity, System.currentTimeMillis(), null); - - if (listener != null) { - listener.newRevision(entity); - } - - return entity; - } -} Deleted: trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-31 08:46:36 UTC (rev 136) @@ -1,45 +0,0 @@ -/* - * Envers. http://www.jboss.org/envers - * - * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU Lesser General Public License, v. 2.1. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Red Hat Author(s): Adam Warski - */ -package org.jboss.envers.revisioninfo; - -import java.util.Map; -import java.util.HashMap; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class DefaultRevisionInfoGenerator extends AbstractRevisionInfoGenerator implements RevisionInfoGenerator { - private final String revisionInfoTimestampName; - - public DefaultRevisionInfoGenerator(String revisionInfoEntityName, String revisionInfoTimestampName) { - super(revisionInfoEntityName); - - this.revisionInfoTimestampName = revisionInfoTimestampName; - } - - public Object newRevision() { - Map revisionInfo = new HashMap(); - revisionInfo.put(revisionInfoTimestampName, System.currentTimeMillis()); - - return revisionInfo; - } -} Copied: trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java (from rev 135, trunk/src/main/org/jboss/envers/revisioninfo/CustomRevisionInfoGenerator.java) =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java 2008-08-31 08:46:36 UTC (rev 136) @@ -0,0 +1,84 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.revisioninfo; + +import org.jboss.envers.RevisionListener; +import org.jboss.envers.tools.reflection.ReflectionTools; +import org.hibernate.MappingException; +import org.hibernate.Session; +import org.hibernate.property.Setter; + +/** + * @author Adam Warski (adam at warski dot org) + */ +public class DefaultRevisionInfoGenerator implements RevisionInfoGenerator { + private final String revisionInfoEntityName; + private final RevisionListener listener; + private final Setter revisionTimestampSetter; + private final Class revisionInfoClass; + + public DefaultRevisionInfoGenerator(String revisionInfoEntityName, Class revisionInfoClass, + Class listenerClass, + String revisionInfoTimestampName) { + this.revisionInfoEntityName = revisionInfoEntityName; + this.revisionInfoClass = revisionInfoClass; + + revisionTimestampSetter = ReflectionTools.getSetter(revisionInfoClass, revisionInfoTimestampName); + + if (!listenerClass.equals(RevisionListener.class)) { + // This is not the default value. + try { + listener = listenerClass.newInstance(); + } catch (InstantiationException e) { + throw new MappingException(e); + } catch (IllegalAccessException e) { + throw new MappingException(e); + } + } else { + // Default listener - none + listener = null; + } + } + + private Object newRevision() { + Object revisionInfo; + try { + revisionInfo = revisionInfoClass.newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + revisionTimestampSetter.set(revisionInfo, System.currentTimeMillis(), null); + + if (listener != null) { + listener.newRevision(revisionInfo); + } + + return revisionInfo; + } + + public Object generate(Session session) { + Object revisionData = newRevision(); + session.save(revisionInfoEntityName, revisionData); + return revisionData; + } +} Property changes on: trunk/src/main/org/jboss/envers/revisioninfo/DefaultRevisionInfoGenerator.java ___________________________________________________________________ Name: svn:mergeinfo + Added: trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoNumberReader.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoNumberReader.java (rev 0) +++ trunk/src/main/org/jboss/envers/revisioninfo/RevisionInfoNumberReader.java 2008-08-31 08:46:36 UTC (rev 136) @@ -0,0 +1,40 @@ +/* + * Envers. http://www.jboss.org/envers + * + * Copyright 2008 Red Hat Middleware, LLC. All rights reserved. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License, v. 2.1. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT A 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, v.2.1 along with this distribution; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + * Red Hat Author(s): Adam Warski + */ +package org.jboss.envers.revisioninfo; + +import org.jboss.envers.tools.reflection.ReflectionTools; +import org.hibernate.property.Getter; + +/** + * Gets a revision number from a persisted revision info entity. + * @author Adam Warski (adam at warski dot org) + */ +public class RevisionInfoNumberReader { + private final Getter revisionIdGetter; + public RevisionInfoNumberReader(Class revisionInfoClass, String revisionInfoIdName) { + revisionIdGetter = ReflectionTools.getGetter(revisionInfoClass, revisionInfoIdName); + } + + public Number getRevisionNumber(Object revision) { + return (Number) revisionIdGetter.get(revision); + } +} Deleted: trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java =================================================================== --- trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/main/org/jboss/envers/revisioninfo/RevisionNumberGenerator.java 2008-08-31 08:46:36 UTC (rev 136) @@ -1,20 +0,0 @@ -package org.jboss.envers.revisioninfo; - -import org.hibernate.Session; - -/** - * @author Adam Warski (adam at warski dot org) - */ -public class RevisionNumberGenerator { - private final String revisionInfoEntityName; - private final RevisionInfoGenerator revisionInfoGenerator; - - public RevisionNumberGenerator(String revisionInfoEntityName, RevisionInfoGenerator revisionInfoGenerator) { - this.revisionInfoEntityName = revisionInfoEntityName; - this.revisionInfoGenerator = revisionInfoGenerator; - } - - public Number generate(Session session) { - return (Number) session.save(revisionInfoEntityName, revisionInfoGenerator.newRevision()); - } -} Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity1.java 2008-08-31 08:46:36 UTC (rev 136) @@ -3,6 +3,7 @@ import org.jboss.envers.Versioned; import org.jboss.envers.SecondaryVersionsTable; import org.jboss.envers.SecondaryVersionsTables; +import org.hibernate.annotations.CollectionOfElements; import javax.persistence.*; import java.util.Set; @@ -33,10 +34,16 @@ @Transient private WorkingEntity2 we2; - @ManyToMany(mappedBy="we1s") - @Versioned + //@ManyToMany(mappedBy="we1s") + //@Versioned + @Transient private Set we2s; + //@CollectionOfElements + //@Versioned + @Transient + private Set strs; + public WorkingEntity1() { } @@ -94,6 +101,14 @@ this.we2s = we2s; } + public Set getStrs() { + return strs; + } + + public void setStrs(Set strs) { + this.strs = strs; + } + public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof WorkingEntity1)) return false; Modified: trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/test/org/jboss/envers/test/working/WorkingEntity2.java 2008-08-31 08:46:36 UTC (rev 136) @@ -21,10 +21,10 @@ @Column private String str2; - @Versioned - //@OneToMany //(mappedBy="we2") - @ManyToMany - //@Transient + //@Versioned + @OneToMany //(mappedBy="we2") + //@ManyToMany + @JoinColumn(name = "ID_2") private Set we1s; //@Versioned Modified: trunk/src/test/org/jboss/envers/test/working/WorkingMain.java =================================================================== --- trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-30 14:41:47 UTC (rev 135) +++ trunk/src/test/org/jboss/envers/test/working/WorkingMain.java 2008-08-31 08:46:36 UTC (rev 136) @@ -49,7 +49,7 @@ Ejb3Configuration cfg = new Ejb3Configuration(); cfg.configure("hibernate.test.cfg.xml"); cfg.addAnnotatedClass(WorkingEntity1.class); - cfg.addAnnotatedClass(WorkingEntity2.class); + //cfg.addAnnotatedClass(WorkingEntity2.class); //cfg.addAnnotatedClass(RevEntity.class); //cfg.addAnnotatedClass(PostalAddress.class); //cfg.addAnnotatedClass(ContactMech.class); @@ -63,30 +63,30 @@ WorkingEntity1 we1 = new WorkingEntity1("b", "c"); entityManager.persist(we1); - WorkingEntity1 we1_2 = new WorkingEntity1("b2", "c2"); + /*WorkingEntity1 we1_2 = new WorkingEntity1("b2", "c2"); entityManager.persist(we1_2); WorkingEntity1 we1_3 = new WorkingEntity1("b3", "c3"); - entityManager.persist(we1_3); + entityManager.persist(we1_3);*/ - WorkingEntity2 we2 = new WorkingEntity2("s"); + /*WorkingEntity2 we2 = new WorkingEntity2("s"); Set we1s = new HashSet(); we1s.add(we1_3); we2.setWe1s(we1s); - entityManager.persist(we2); + entityManager.persist(we2); */ entityManager.getTransaction().commit(); // Rev 2 entityManager.getTransaction().begin(); - we1_3 = entityManager.find(WorkingEntity1.class, we1_3.getId1()); + /*we1_3 = entityManager.find(WorkingEntity1.class, we1_3.getId1()); WorkingEntity2 we2_1 = new WorkingEntity2("s2"); we1s = new HashSet(); we1s.add(we1_3); we2_1.setWe1s(we1s); - entityManager.persist(we2_1); + entityManager.persist(we2_1);*/ entityManager.getTransaction().commit(); @@ -94,11 +94,12 @@ entityManager.getTransaction().begin(); VersionsReader vr = VersionsReaderFactory.get(entityManager); - System.out.println("1: " + vr.find(WorkingEntity1.class, we1_3.getId1(), 1).getWe2s()); - System.out.println("2: " + vr.find(WorkingEntity1.class, we1_3.getId1(), 2).getWe2s()); + System.out.println("Revisions: "); + List results = vr.createQuery().forRevisionsOfEntity(WorkingEntity1.class, false, true).getResultList(); + for (Object result : results) { + System.out.println(Arrays.toString((Object[]) result)); + } - System.out.println("Revs we1_3: " + vr.getRevisions(WorkingEntity1.class, we1_3.getId1())); - entityManager.getTransaction().commit(); } }