Author: adamw
Date: 2008-09-22 14:07:02 -0400 (Mon, 22 Sep 2008)
New Revision: 162
Added:
trunk/src/test/org/jboss/envers/test/entities/collection/EnumSetEntity.java
trunk/src/test/org/jboss/envers/test/integration/collection/EnumSet.java
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java
trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java
Log:
ENVERS-24, ENVERS-42: enum support in collections
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java 2008-09-22
16:45:44 UTC (rev 161)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java 2008-09-22
18:07:02 UTC (rev 162)
@@ -71,7 +71,7 @@
MetadataTools.addColumns(prop_mapping, (Iterator<Column>)
value.getColumnIterator());
}
- // A null mapper means that we only want to add xml mappings (while building the
id mapping)
+ // A null mapper means that we only want to add xml mappings
if (mapper != null) {
mapper.add(name, store);
}
@@ -81,8 +81,8 @@
private void addEnumValue(Element parent, String name, Value value,
SimpleMapperBuilder mapper,
ModificationStore store, boolean key) {
if (parent != null) {
- Element prop_mapping = parent.addElement("property");
- prop_mapping.addAttribute("name", name);
+ Element prop_mapping = MetadataTools.addProperty(parent, name,
+ null, key);
CustomType propertyType = (CustomType) value.getType();
@@ -93,14 +93,16 @@
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]));
+ Element type_param2 = type_mapping.addElement("param");
+ type_param2.addAttribute("name", "type");
+ type_param2.setText(Integer.toString(propertyType.sqlTypes(null)[0]));
MetadataTools.addColumns(prop_mapping, (Iterator<Column>)
value.getColumnIterator());
}
- mapper.add(name, store);
+ if (mapper != null) {
+ mapper.add(name, store);
+ }
}
private void addComponentClassName(Element any_mapping, Component comp) {
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java 2008-09-22
16:45:44 UTC (rev 161)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java 2008-09-22
18:07:02 UTC (rev 162)
@@ -304,17 +304,18 @@
return new MiddleComponentData(new
MiddleRelatedComponentMapper(referencedIdData),
queryGeneratorBuilder.getCurrentIndex());
- } else if (type instanceof ImmutableType || type instanceof MutableType) {
- // TODO: add support for enums, components, custom types
- mainGenerator.getBasicMetadataGenerator().addBasic(xmlMapping, prefix, value,
null, ModificationStore.FULL,
- referencingEntityName, true);
+ } else {
+ boolean mapped =
mainGenerator.getBasicMetadataGenerator().addBasic(xmlMapping, prefix, value, null,
+ ModificationStore.FULL, referencingEntityName, true);
- // Simple values are always stored in the first entity read by the query
generator.
- return new MiddleComponentData(new
MiddleSimpleComponentMapper(mainGenerator.getVerEntCfg(), prefix), 0);
- } else {
- mainGenerator.throwUnsupportedTypeException(type, referencingEntityName,
propertyName);
- // Impossible to get here.
- throw new AssertionError();
+ if (mapped) {
+ // Simple values are always stored in the first item of the array
returned by the query generator.
+ return new MiddleComponentData(new
MiddleSimpleComponentMapper(mainGenerator.getVerEntCfg(), prefix), 0);
+ } else {
+ mainGenerator.throwUnsupportedTypeException(type, referencingEntityName,
propertyName);
+ // Impossible to get here.
+ throw new AssertionError();
+ }
}
}
Modified: trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-09-22
16:45:44 UTC (rev 161)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-09-22
18:07:02 UTC (rev 162)
@@ -52,8 +52,12 @@
prop_mapping = parent.addElement("property");
}
- prop_mapping.addAttribute("name", name).addAttribute("type",
type);
+ prop_mapping.addAttribute("name", name);
+ if (type != null) {
+ prop_mapping.addAttribute("type", type);
+ }
+
return prop_mapping;
}
Copied: trunk/src/test/org/jboss/envers/test/entities/collection/EnumSetEntity.java (from
rev 153, trunk/src/test/org/jboss/envers/test/entities/collection/StringSetEntity.java)
===================================================================
--- trunk/src/test/org/jboss/envers/test/entities/collection/EnumSetEntity.java
(rev 0)
+++ trunk/src/test/org/jboss/envers/test/entities/collection/EnumSetEntity.java 2008-09-22
18:07:02 UTC (rev 162)
@@ -0,0 +1,79 @@
+package org.jboss.envers.test.entities.collection;
+
+import org.jboss.envers.Versioned;
+import org.hibernate.annotations.CollectionOfElements;
+
+import javax.persistence.*;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+@Entity
+public class EnumSetEntity {
+ public static enum E1 { X, Y }
+ public static enum E2 { A, B }
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @Versioned
+ @CollectionOfElements
+ @Enumerated(EnumType.STRING)
+ private Set<E1> enums1;
+
+ @Versioned
+ @CollectionOfElements
+ @Enumerated(EnumType.ORDINAL)
+ private Set<E2> enums2;
+
+ public EnumSetEntity() {
+ enums1 = new HashSet<E1>();
+ enums2 = new HashSet<E2>();
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Set<E1> getEnums1() {
+ return enums1;
+ }
+
+ public void setEnums1(Set<E1> enums1) {
+ this.enums1 = enums1;
+ }
+
+ public Set<E2> getEnums2() {
+ return enums2;
+ }
+
+ public void setEnums2(Set<E2> enums2) {
+ this.enums2 = enums2;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof EnumSetEntity)) return false;
+
+ EnumSetEntity that = (EnumSetEntity) o;
+
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return (id != null ? id.hashCode() : 0);
+ }
+
+ public String toString() {
+ return "ESE(id = " + id + ", enums1 = " + enums1 + ",
enums2 = " + enums2 + ")";
+ }
+}
\ No newline at end of file
Property changes on:
trunk/src/test/org/jboss/envers/test/entities/collection/EnumSetEntity.java
___________________________________________________________________
Name: svn:mergeinfo
+
Copied: trunk/src/test/org/jboss/envers/test/integration/collection/EnumSet.java (from rev
154, trunk/src/test/org/jboss/envers/test/integration/collection/StringSet.java)
===================================================================
--- trunk/src/test/org/jboss/envers/test/integration/collection/EnumSet.java
(rev 0)
+++ trunk/src/test/org/jboss/envers/test/integration/collection/EnumSet.java 2008-09-22
18:07:02 UTC (rev 162)
@@ -0,0 +1,86 @@
+package org.jboss.envers.test.integration.collection;
+
+import org.jboss.envers.test.integration.AbstractEntityTest;
+import org.jboss.envers.test.tools.TestTools;
+import org.jboss.envers.test.entities.collection.EnumSetEntity;
+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 static org.jboss.envers.test.entities.collection.EnumSetEntity.*;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class EnumSet extends AbstractEntityTest {
+ private Integer sse1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(EnumSetEntity.class);
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ EnumSetEntity sse1 = new EnumSetEntity();
+
+ // Revision 1 (sse1: initialy 1 element)
+ em.getTransaction().begin();
+
+ sse1.getEnums1().add(E1.X);
+ sse1.getEnums2().add(E2.A);
+
+ em.persist(sse1);
+
+ em.getTransaction().commit();
+
+ // Revision 2 (sse1: adding 1 element/removing a non-existing element)
+ em.getTransaction().begin();
+
+ sse1 = em.find(EnumSetEntity.class, sse1.getId());
+
+ sse1.getEnums1().add(E1.Y);
+ sse1.getEnums2().remove(E2.B);
+
+ em.getTransaction().commit();
+
+ // Revision 3 (sse1: removing 1 element/adding an exisiting element)
+ em.getTransaction().begin();
+
+ sse1 = em.find(EnumSetEntity.class, sse1.getId());
+
+ sse1.getEnums1().remove(E1.X);
+ sse1.getEnums2().add(E2.A);
+
+ em.getTransaction().commit();
+
+ //
+
+ sse1_id = sse1.getId();
+ }
+
+ @Test
+ public void testRevisionsCounts() {
+ assert Arrays.asList(1, 2,
3).equals(getVersionsReader().getRevisions(EnumSetEntity.class, sse1_id));
+ }
+
+ @Test
+ public void testHistoryOfSse1() {
+ EnumSetEntity rev1 = getVersionsReader().find(EnumSetEntity.class, sse1_id, 1);
+ EnumSetEntity rev2 = getVersionsReader().find(EnumSetEntity.class, sse1_id, 2);
+ EnumSetEntity rev3 = getVersionsReader().find(EnumSetEntity.class, sse1_id, 3);
+
+ assert rev1.getEnums1().equals(TestTools.makeSet(E1.X));
+ assert rev2.getEnums1().equals(TestTools.makeSet(E1.X, E1.Y));
+ assert rev3.getEnums1().equals(TestTools.makeSet(E1.Y));
+
+ assert rev1.getEnums2().equals(TestTools.makeSet(E2.A));
+ assert rev2.getEnums2().equals(TestTools.makeSet(E2.A));
+ assert rev3.getEnums2().equals(TestTools.makeSet(E2.A));
+ }
+}
\ No newline at end of file