[hibernate-commits] Hibernate SVN: r16055 - in core/trunk/envers/src: main/java/org/hibernate/envers/entities/mapper/relation and 6 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Mar 2 11:08:45 EST 2009


Author: adamw
Date: 2009-03-02 11:08:45 -0500 (Mon, 02 Mar 2009)
New Revision: 16055

Added:
   core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/ComponentSetTestEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/collections/
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/collections/CollectionOfComponents.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/ChangingHashcode.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiImage.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiPage.java
Modified:
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java
Log:
* a disabled tests for collecitons of components
* fixing a bug whit auditing collections when the hashcode of the elements in the colleciton changes

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java	2009-03-02 14:36:20 UTC (rev 16054)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/reader/AuditedPropertiesReader.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -251,7 +251,7 @@
 		public Class<? extends Annotation> annotationType() { return this.getClass(); }
 	};
 
-	private class ComponentPropertiesSource implements PersistentPropertiesSource {
+	private static class ComponentPropertiesSource implements PersistentPropertiesSource {
 		private final XClass xclass;
 		private final Component component;
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java	2009-03-02 14:36:20 UTC (rev 16054)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -114,13 +114,16 @@
 
         Set<Object> added = new HashSet<Object>();
         if (newColl != null) { added.addAll(newCollection); }
-        if (oldColl != null) { added.removeAll(oldCollection); }
+		// Re-hashing the old collection as the hash codes of the elements there may have changed, and the
+		// removeAll in AbstractSet has an implementation that is hashcode-change sensitive (as opposed to addAll).
+        if (oldColl != null) { added.removeAll(new HashSet(oldCollection)); }
 
         addCollectionChanges(collectionChanges, added, RevisionType.ADD, id);
 
         Set<Object> deleted = new HashSet<Object>();
         if (oldColl != null) { deleted.addAll(oldCollection); }
-        if (newColl != null) { deleted.removeAll(newCollection); }
+		// The same as above - re-hashing new collection.
+        if (newColl != null) { deleted.removeAll(new HashSet(newCollection)); }
 
         addCollectionChanges(collectionChanges, deleted, RevisionType.DEL, id);
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java	2009-03-02 14:36:20 UTC (rev 16054)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -57,7 +57,6 @@
 import org.hibernate.event.PreCollectionUpdateEvent;
 import org.hibernate.event.PreCollectionUpdateEventListener;
 import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.persister.collection.AbstractCollectionPersister;
 import org.hibernate.proxy.HibernateProxy;
 
 /**

Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/ComponentSetTestEntity.java (from rev 15911, core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/ComponentTestEntity.java)
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/ComponentSetTestEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/ComponentSetTestEntity.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -0,0 +1,100 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * 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, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.test.entities.components;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class ComponentSetTestEntity {
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @Embedded
+    @Audited
+    private Set<Component1> comps = new HashSet<Component1>();
+
+	public ComponentSetTestEntity() {
+	}
+
+	public ComponentSetTestEntity(Integer id) {
+		this.id = id;
+	}
+
+	public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+	public Set<Component1> getComps() {
+		return comps;
+	}
+
+	public void setComps(Set<Component1> comps) {
+		this.comps = comps;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof ComponentSetTestEntity)) return false;
+
+		ComponentSetTestEntity that = (ComponentSetTestEntity) o;
+
+		if (comps != null ? !comps.equals(that.comps) : that.comps != null) return false;
+		if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+		return true;
+	}
+
+	@Override
+	public int hashCode() {
+		int result = id != null ? id.hashCode() : 0;
+		result = 31 * result + (comps != null ? comps.hashCode() : 0);
+		return result;
+	}
+
+	@Override
+	public String toString() {
+		return "ComponentSetTestEntity{" +
+				"id=" + id +
+				", comps=" + comps +
+				'}';
+	}
+}
\ No newline at end of file


Property changes on: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/components/ComponentSetTestEntity.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/collections/CollectionOfComponents.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/collections/CollectionOfComponents.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/components/collections/CollectionOfComponents.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -0,0 +1,87 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * 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, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.test.integration.components.collections;
+
+import java.util.Arrays;
+import java.util.Set;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.components.Component1;
+import org.hibernate.envers.test.entities.components.ComponentSetTestEntity;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * TODO: enable and implement
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class CollectionOfComponents extends AbstractEntityTest {
+    private Integer id1;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(ComponentSetTestEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        // Revision 1
+        EntityManager em = getEntityManager();
+        em.getTransaction().begin();
+
+        ComponentSetTestEntity cte1 = new ComponentSetTestEntity();
+
+        em.persist(cte1);
+
+        em.getTransaction().commit();
+
+        // Revision 2
+        em = getEntityManager();
+        em.getTransaction().begin();
+
+        cte1 = em.find(ComponentSetTestEntity.class, cte1.getId());
+
+        cte1.getComps().add(new Component1("a", "b"));
+
+        em.getTransaction().commit();
+
+        id1 = cte1.getId();
+    }
+
+    @Test(enabled = false)
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(ComponentSetTestEntity.class, id1));
+    }
+
+    @Test(enabled = false)
+    public void testHistoryOfId1() {
+        assert getAuditReader().find(ComponentSetTestEntity.class, id1, 1).getComps().size() == 0;
+		
+		Set<Component1> comps1 = getAuditReader().find(ComponentSetTestEntity.class, id1, 2).getComps();
+        assert comps1.size() == 1;
+		assert comps1.contains(new Component1("a", "b"));
+    }
+}
\ No newline at end of file

Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/ChangingHashcode.java (from rev 16053, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java)
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/ChangingHashcode.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/ChangingHashcode.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -0,0 +1,103 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * 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, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.test.integration.hashcode;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.tools.TestTools;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ChangingHashcode extends AbstractEntityTest {
+	private Long pageId;
+	private Long imageId;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(WikiPage.class);
+        cfg.addAnnotatedClass(WikiImage.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        // Revision 1
+        EntityManager em = getEntityManager();
+        em.getTransaction().begin();
+
+		WikiPage page = new WikiPage("title", "content");
+        em.persist(page);
+
+        em.getTransaction().commit();
+
+        // Revision 2
+        em = getEntityManager();
+        em.getTransaction().begin();
+
+        WikiImage image = new WikiImage("name1");
+		em.persist(image);
+
+		page = em.find(WikiPage.class, page.getId());
+		page.getImages().add(image);
+
+        em.getTransaction().commit();
+
+        // Revision 3
+        em = getEntityManager();
+        em.getTransaction().begin();
+
+        image = em.find(WikiImage.class, image.getId());
+		image.setName("name2");
+
+        em.getTransaction().commit();
+
+		pageId = page.getId();
+		imageId = image.getId();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getAuditReader().getRevisions(WikiPage.class, pageId));
+        assert Arrays.asList(2, 3).equals(getAuditReader().getRevisions(WikiImage.class, imageId));
+    }
+
+    @Test
+    public void testHistoryOfImage() {
+		assert getAuditReader().find(WikiImage.class, imageId, 1) == null;
+        assert getAuditReader().find(WikiImage.class, imageId, 2).equals(new WikiImage("name1"));
+        assert getAuditReader().find(WikiImage.class, imageId, 3).equals(new WikiImage("name2"));
+    }
+
+    @Test
+    public void testHistoryOfPage() {
+        assert getAuditReader().find(WikiPage.class, pageId, 1).getImages().size() == 0;
+        assert getAuditReader().find(WikiPage.class, pageId, 2).getImages().equals(TestTools.makeSet(new WikiImage("name1")));
+        assert getAuditReader().find(WikiPage.class, pageId, 3).getImages().equals(TestTools.makeSet(new WikiImage("name2")));
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiImage.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiImage.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiImage.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -0,0 +1,65 @@
+package org.hibernate.envers.test.integration.hashcode;
+
+import org.hibernate.envers.Audited;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+import javax.persistence.Basic;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class WikiImage {
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	@Basic
+	private String name;
+
+	public WikiImage() {
+	}
+
+	public WikiImage(String name) {
+		this.name = name;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof WikiImage)) return false;
+
+		WikiImage wikiImage = (WikiImage) o;
+
+		if (name != null ? !name.equals(wikiImage.name) : wikiImage.name != null) return false;
+
+		return true;
+	}
+
+	@Override
+	public int hashCode() {
+		return name != null ? name.hashCode() : 0;
+	}
+
+	@Override
+	public String toString() {
+		return "WikiImage{" +
+				"name='" + name + '\'' +
+				'}';
+	}
+}

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiPage.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiPage.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/hashcode/WikiPage.java	2009-03-02 16:08:45 UTC (rev 16055)
@@ -0,0 +1,109 @@
+package org.hibernate.envers.test.integration.hashcode;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.envers.Audited;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Basic;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+ at Audited
+public class WikiPage {
+	@Id
+	@GeneratedValue
+	private Long id;
+
+	@Basic
+	private String title;
+
+	@Basic
+	private String content;
+
+	@CollectionOfElements
+	private Set<String> links = new HashSet<String>();
+
+	@OneToMany
+	private Set<WikiImage> images = new HashSet<WikiImage>();
+
+	public WikiPage() {
+	}
+
+	public WikiPage(String title, String content) {
+		this.title = title;
+		this.content = content;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public Set<String> getLinks() {
+		return links;
+	}
+
+	public void setLinks(Set<String> links) {
+		this.links = links;
+	}
+
+	public Set<WikiImage> getImages() {
+		return images;
+	}
+
+	public void setImages(Set<WikiImage> images) {
+		this.images = images;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof WikiPage)) return false;
+
+		WikiPage wikiPage = (WikiPage) o;
+
+		if (content != null ? !content.equals(wikiPage.content) : wikiPage.content != null) return false;
+		if (title != null ? !title.equals(wikiPage.title) : wikiPage.title != null) return false;
+
+		return true;
+	}
+
+	@Override
+	public int hashCode() {
+		int result = title != null ? title.hashCode() : 0;
+		result = 31 * result + (content != null ? content.hashCode() : 0);
+		return result;
+	}
+
+	@Override
+	public String toString() {
+		return "WikiPage{" +
+				"title='" + title + '\'' +
+				", content='" + content + '\'' +
+				", links=" + links +
+				", images=" + images +
+				'}';
+	}
+}




More information about the hibernate-commits mailing list