[jboss-envers-commits] JBoss Envers SVN: r159 - in trunk/src: main/org/jboss/envers/configuration and 4 other directories.

jboss-envers-commits at lists.jboss.org jboss-envers-commits at lists.jboss.org
Mon Sep 22 07:26:24 EDT 2008


Author: adamw
Date: 2008-09-22 07:26:24 -0400 (Mon, 22 Sep 2008)
New Revision: 159

Added:
   trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java
   trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java
   trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java
   trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java
Modified:
   trunk/src/main/org/jboss/envers/VersionsJoinTable.java
   trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java
   trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java
   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
   trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java
   trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
   trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java
   trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java
Log:
ENVERS-26: support for @VersionsJoinTable, and unidirectional one-to-many associations mapped with @OneToMany+ at JoinColumn

Modified: trunk/src/main/org/jboss/envers/VersionsJoinTable.java
===================================================================
--- trunk/src/main/org/jboss/envers/VersionsJoinTable.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/VersionsJoinTable.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -50,8 +50,8 @@
     String catalog() default "";
 
     /**
-     * @return The foreign key columns of the join table which reference the primary table of the entity owning the
-     * association (i.e. the owning side of the association).
+     * @return The foreign key columns of the join table which reference the primary table of the entity that does not
+     * own the association (i.e. the inverse side of the association).
      */
-    JoinColumn[] joinColumns() default {};
+    JoinColumn[] inverseJoinColumns() default {};
 }
\ 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-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -28,6 +28,7 @@
 import org.jboss.envers.configuration.metadata.EntityXmlMappingData;
 import org.jboss.envers.tools.graph.GraphTopologicalSort;
 import org.jboss.envers.tools.reflection.YReflectionManager;
+import org.jboss.envers.tools.StringTools;
 import org.dom4j.io.DOMWriter;
 import org.dom4j.io.XMLWriter;
 import org.dom4j.io.OutputFormat;
@@ -75,8 +76,8 @@
             if (versioningData.isVersioned()) {
                 pcDatas.put(pc, versioningData);
 
-                if (versioningData.versionsTableName != null) {
-                    verEntCfg.addCustomVersionsTableName(pc.getEntityName(), versioningData.versionsTableName);
+                if (!StringTools.isEmpty(versioningData.versionsTable.value())) {
+                    verEntCfg.addCustomVersionsTableName(pc.getEntityName(), versioningData.versionsTable.value());
                 }
 
                 EntityXmlMappingData xmlMappingData = new EntityXmlMappingData();

Modified: trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -31,6 +31,8 @@
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.MappingException;
 
+import java.lang.annotation.Annotation;
+
 /**
  * A helper class to read versioning meta-data from annotations on a persistent class.
  * @author Adam Warski (adam at warski dot org)
@@ -117,9 +119,9 @@
     private void addVersionsTable(YClass clazz) {
         VersionsTable versionsTable = clazz.getAnnotation(VersionsTable.class);
         if (versionsTable != null) {
-            versioningData.versionsTableName = versionsTable.value();
-            versioningData.schema = versionsTable.schema();
-            versioningData.catalog = versionsTable.catalog();
+            versioningData.versionsTable = versionsTable;
+        } else {
+            versioningData.versionsTable = getDefaultVersionsTable();
         }
     }
 
@@ -158,4 +160,13 @@
 
         return versioningData;
     }
+
+    private VersionsTable getDefaultVersionsTable() {
+        return new VersionsTable() {
+            public String value() { return ""; }
+            public String schema() { return ""; }
+            public String catalog() { return ""; }
+            public Class<? extends Annotation> annotationType() { return this.getClass(); }
+        };
+    }
 }

Modified: trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -108,7 +108,7 @@
         while (properties.hasNext()) {
             Property property = properties.next();
             mainGenerator.addValue(component_mapping, property.getName(), property.getValue(),
-                    componentMapper, ModificationStore.FULL, entityName, xmlMappingData, firstPass);
+                    componentMapper, ModificationStore.FULL, entityName, xmlMappingData, null, firstPass);
         }
     }
 }

Modified: trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -17,12 +17,15 @@
 import org.jboss.envers.tools.Tools;
 import org.jboss.envers.tools.StringTools;
 import org.jboss.envers.ModificationStore;
+import org.jboss.envers.VersionsJoinTable;
 import org.dom4j.Element;
 
+import javax.persistence.JoinColumn;
 import java.util.*;
 import java.util.Set;
 import java.util.List;
 import java.util.Map;
+import java.lang.annotation.Annotation;
 
 /**
  * Generates metadata for collection-valued properties.
@@ -36,17 +39,29 @@
     }
 
     void addCollection(String name, Collection value, CompositeMapperBuilder currentMapper,
-                       String entityName, EntityXmlMappingData xmlMappingData) {
+                       String entityName, EntityXmlMappingData xmlMappingData,
+                       VersionsJoinTable joinTable) {
         Type type = value.getType();
 
         if ((type instanceof BagType || type instanceof SetType) &&
                 (value.getElement() instanceof OneToMany) && (value.isInverse())) {
             addOneToManyAttached(name, value, currentMapper, entityName);
         } else {
-            addWithMiddleTable(name, value, currentMapper, entityName, xmlMappingData);
+            addWithMiddleTable(name, value, currentMapper, entityName, xmlMappingData,
+                    joinTable == null ? getDefaultVersionsJoinTable() : joinTable);
         }
     }
 
+    private VersionsJoinTable getDefaultVersionsJoinTable() {
+        return new VersionsJoinTable() {
+            public String name() { return ""; }
+            public String schema() { return ""; }
+            public String catalog() { return ""; }
+            public JoinColumn[] inverseJoinColumns() { return new JoinColumn[0]; }
+            public Class<? extends Annotation> annotationType() { return this.getClass(); }
+        };
+    }
+
     @SuppressWarnings({"unchecked"})
     private String getMappedBy(Collection collectionValue) {
         Iterator<Property> assocClassProps =
@@ -113,7 +128,7 @@
     private String getReferencedEntityName(Value value) {
         if (value instanceof ToOne) {
             return ((ToOne) value).getReferencedEntityName();
-        } if (value instanceof OneToMany) {
+        } else if (value instanceof OneToMany) {
             return ((OneToMany) value).getReferencedEntityName();
         } else {
             return null;
@@ -121,9 +136,11 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    private void addRelatedToXmlMapping(Element xmlMapping, String prefix, Value relatedValue, IdMappingData relatedIdMapping) {
+    private void addRelatedToXmlMapping(Element xmlMapping, String prefix,
+                                        MetadataTools.ColumnNameIterator columnNameIterator,
+                                        IdMappingData relatedIdMapping) {
         Element properties = (Element) relatedIdMapping.getXmlRelationMapping().clone();
-        MetadataTools.prefixNamesInPropertyElement(properties, prefix, relatedValue.getColumnIterator(), true);
+        MetadataTools.prefixNamesInPropertyElement(properties, prefix, columnNameIterator, true);
         for (Element idProperty : (java.util.List<Element>) properties.elements()) {
             xmlMapping.add((Element) idProperty.clone());
         }
@@ -131,10 +148,9 @@
 
     private String getMiddleTableName(Collection value, String entityName) {
         // We check how Hibernate maps the collection.
-        if (value.getKey().getTable().equals(value.getCollectionTable())) {
-            // The table of the element is the same as the collection table - this must be a @JoinColumn+ at OneToMany
-            // mapping. Generating the table name ourselves, as Hibernate doesn't use a middle table for mapping
-            // this relation.
+        if (value.getElement() instanceof OneToMany && !value.isInverse()) {
+            // This must be a @JoinColumn+ at OneToMany mapping. Generating the table name, as Hibernate doesn't use a
+            // middle table for mapping this relation.
             return StringTools.getLastComponent(entityName) + "_" + StringTools.getLastComponent(getReferencedEntityName(value.getElement()));
         } else {
             // Hibernate uses a middle table for mapping this relation, so we get it's name directly. 
@@ -144,21 +160,28 @@
 
     @SuppressWarnings({"unchecked"})
     private void addWithMiddleTable(String name, Collection value, CompositeMapperBuilder currentMapper,
-                                    String entityName, EntityXmlMappingData xmlMappingData) {
-        // Generating the name of the middle table, its schema and catalog
-        // TODO: add support for @VersionsJoinTable
-        String middleTableName = getMiddleTableName(value, entityName);//value.getCollectionTable().getName();
-        String versionsMiddleTableName = mainGenerator.getVerEntCfg().getVersionsTableName(null, middleTableName);
-        String versionsMiddleEntityName = mainGenerator.getVerEntCfg().getVersionsEntityName(middleTableName);
+                                    String entityName, EntityXmlMappingData xmlMappingData, VersionsJoinTable joinTable) {
+        // Generating the name of the middle table
 
-        String schema = value.getCollectionTable().getSchema();
-        String catalog = value.getCollectionTable().getCatalog();
+        String versionsMiddleTableName;
+        String versionsMiddleEntityName;
+        if (!StringTools.isEmpty(joinTable.name())) {
+            versionsMiddleTableName = joinTable.name();
+            versionsMiddleEntityName = joinTable.name();
+        } else {
+            String middleTableName = getMiddleTableName(value, entityName);
+            versionsMiddleTableName = mainGenerator.getVerEntCfg().getVersionsTableName(null, middleTableName);
+            versionsMiddleEntityName = mainGenerator.getVerEntCfg().getVersionsEntityName(middleTableName);
+        }
 
         // Generating the XML mapping for the middle entity, only if the relation isn't inverse.
         // If the relation is inverse, will be later checked by comparing middleEntityXml with null.
         Element middleEntityXml;
         Element middleEntityXmlId;
         if (!value.isInverse()) {
+            String schema = StringTools.isEmpty(joinTable.schema()) ? value.getCollectionTable().getSchema() : joinTable.schema();
+            String catalog = StringTools.isEmpty(joinTable.catalog()) ? value.getCollectionTable().getCatalog() : joinTable.catalog();
+
             middleEntityXml = MetadataTools.createEntity(xmlMappingData.newAdditionalMapping(),
                     versionsMiddleEntityName, versionsMiddleTableName, schema, catalog, null);
             middleEntityXmlId = middleEntityXml.addElement("composite-id");
@@ -221,7 +244,9 @@
             middleEntityXmlId.addAttribute("name", mainGenerator.getVerEntCfg().getOriginalIdPropName());
 
             // Adding related-entity (in this case: the referencing's entity id) id mapping to the xml.
-            addRelatedToXmlMapping(middleEntityXmlId, referencingPrefixRelated, value.getKey(), referencingIdMapping);
+            addRelatedToXmlMapping(middleEntityXmlId, referencingPrefixRelated,
+                    MetadataTools.getColumnNameIterator(value.getKey().getColumnIterator()),
+                    referencingIdMapping);
 
             // Adding the revision number as a foreign key to the revision info entity to the composite id of the
             // middle table.
@@ -235,7 +260,7 @@
         // Generating the element mapping.
         // ******
         MiddleComponentData elementComponentData = addValueToMiddleTable(value.getElement(), middleEntityXmlId,
-                queryGeneratorBuilder, referencedPrefix);
+                queryGeneratorBuilder, referencedPrefix, joinTable.inverseJoinColumns());
 
         // ******
         // Optionally, generating the index mapping.
@@ -244,8 +269,8 @@
         if (value instanceof IndexedCollection) {
             IndexedCollection indexedValue = (IndexedCollection) value;
             indexComponentData = addValueToMiddleTable(indexedValue.getIndex(), middleEntityXmlId,
-                    queryGeneratorBuilder, "mapkey");
-            // TODO
+                    queryGeneratorBuilder, "mapkey", null);
+            // TODO: @MapKey support, @MapKeyManyToMany
         } else {
             // No index - creating a dummy mapper.
             indexComponentData = new MiddleComponentData(new MiddleDummyComponentMapper(),
@@ -289,7 +314,7 @@
         // ******
         // Storing information about this relation.
         // ******
-        
+
         // Only if this is a relation (when there is a referenced entity).
         if (referencedEntityName != null) {
             if (value.isInverse()) {
@@ -310,11 +335,13 @@
      * @param queryGeneratorBuilder In case <code>value</code> is a relation to another entity, information about it
      * should be added to the given.
      * @param prefix Prefix for proeprty names of related entities identifiers.
+     * @param joinColumns Names of columns to use in the xml mapping, if this array isn't null and has any elements.
      * @return Data for mapping this component.
      */
+    @SuppressWarnings({"unchecked"})
     private MiddleComponentData addValueToMiddleTable(Value value, Element middleEntityXml,
                                                       QueryGeneratorBuilder queryGeneratorBuilder,
-                                                      String prefix) {
+                                                      String prefix, JoinColumn[] joinColumns) {
         Type type = value.getType();
         if (type instanceof ManyToOneType) {
             String prefixRelated = prefix + "_";
@@ -326,7 +353,11 @@
             // Adding related-entity (in this case: the referenced entities id) id mapping to the xml only if the
             // relation isn't inverse (so when <code>middleEntityXml</code> is not null).
             if (middleEntityXml != null) {
-                addRelatedToXmlMapping(middleEntityXml, prefixRelated, value, referencedIdMapping);
+                addRelatedToXmlMapping(middleEntityXml, prefixRelated,
+                        joinColumns != null && joinColumns.length > 0
+                                ? MetadataTools.getColumnNameIterator(joinColumns)
+                                : MetadataTools.getColumnNameIterator(value.getColumnIterator()),
+                        referencedIdMapping);
             }
 
             // Storing the id data of the referenced entity: original mapper, prefixed mapper and entity name.

Modified: trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -27,6 +27,7 @@
 import org.jboss.envers.tools.StringTools;
 import org.hibernate.mapping.Column;
 
+import javax.persistence.JoinColumn;
 import java.util.Iterator;
 
 /**
@@ -104,8 +105,8 @@
     }
 
     public static Element createSubclassEntity(Document document, String entityName, String tableName,
-                                              String schema, String catalog, String extendsEntityName,
-                                              String discriminatorValue) {
+                                               String schema, String catalog, String extendsEntityName,
+                                               String discriminatorValue) {
         Element class_mapping = createEntityCommon(document, "subclass", entityName, tableName, schema, catalog,
                 discriminatorValue);
 
@@ -137,9 +138,9 @@
             addColumn(any_mapping, column.getName(), column.getLength());
         }
     }
-      
+
     @SuppressWarnings({"unchecked"})
-    private static void changeNamesInColumnElement(Element element, Iterator<Column> columnIterator) {
+    private static void changeNamesInColumnElement(Element element, ColumnNameIterator columnNameIterator) {
         Iterator<Element> properties = element.elementIterator();
         while (properties.hasNext()) {
             Element property = properties.next();
@@ -147,15 +148,15 @@
             if ("column".equals(property.getName())) {
                 Attribute nameAttr = property.attribute("name");
                 if (nameAttr != null) {
-                    nameAttr.setText(columnIterator.next().getName());
+                    nameAttr.setText(columnNameIterator.next());
                 }
             }
         }
     }
 
     @SuppressWarnings({"unchecked"})
-    public static void prefixNamesInPropertyElement(Element element, String prefix, Iterator<Column> columnIterator,
-                                              boolean changeToKey) {
+    public static void prefixNamesInPropertyElement(Element element, String prefix, ColumnNameIterator columnNameIterator,
+                                                    boolean changeToKey) {
         Iterator<Element> properties = element.elementIterator();
         while (properties.hasNext()) {
             Element property = properties.next();
@@ -166,7 +167,7 @@
                     nameAttr.setText(prefix + nameAttr.getText());
                 }
 
-                changeNamesInColumnElement(property, columnIterator);
+                changeNamesInColumnElement(property, columnNameIterator);
 
                 if (changeToKey) {
                     property.setName("key-property");
@@ -174,4 +175,26 @@
             }
         }
     }
+
+    /**
+     * An iterator over column names.
+     */
+    public static abstract class ColumnNameIterator implements Iterator<String> { }
+
+    public static ColumnNameIterator getColumnNameIterator(final Iterator<Column> columnIterator) {
+        return new ColumnNameIterator() {
+            public boolean hasNext() { return columnIterator.hasNext(); }
+            public String next() { return columnIterator.next().getName(); }
+            public void remove() { columnIterator.remove(); }
+        };
+    }
+
+    public static ColumnNameIterator getColumnNameIterator(final JoinColumn[] joinColumns) {
+        return new ColumnNameIterator() {
+            int counter = 0;
+            public boolean hasNext() { return counter < joinColumns.length; }
+            public String next() { return joinColumns[counter++].name(); }
+            public void remove() { throw new UnsupportedOperationException(); }
+        };
+    }
 }

Modified: trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -23,6 +23,7 @@
 
 import org.jboss.envers.ModificationStore;
 import org.jboss.envers.VersionsJoinTable;
+import org.jboss.envers.VersionsTable;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -42,9 +43,7 @@
     }
 
     public PropertyStoreInfo propertyStoreInfo;
-    public String versionsTableName;
-    public String schema;
-    public String catalog;
+    public VersionsTable versionsTable;
     public Map<String, String> secondaryTableDictionary;
     public List<String> unversionedProperties;
     /**

Modified: trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -46,7 +46,8 @@
         Element properties = (Element) idMapping.getXmlRelationMapping().clone();
         properties.addAttribute("name", name);
 
-        MetadataTools.prefixNamesInPropertyElement(properties, lastPropertyPrefix, value.getColumnIterator(), false);
+        MetadataTools.prefixNamesInPropertyElement(properties, lastPropertyPrefix,
+                MetadataTools.getColumnNameIterator(value.getColumnIterator()), false);
         parent.add(properties);
 
         // Adding mapper for the id

Modified: trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -35,6 +35,7 @@
 import org.jboss.envers.tools.StringTools;
 import org.jboss.envers.tools.HibernateVersion;
 import org.jboss.envers.ModificationStore;
+import org.jboss.envers.VersionsJoinTable;
 import org.jboss.envers.tools.log.YLog;
 import org.jboss.envers.tools.log.YLogManager;
 
@@ -120,7 +121,7 @@
     @SuppressWarnings({"unchecked"})
     void addValue(Element parent, String name, Value value, CompositeMapperBuilder currentMapper,
                   ModificationStore store, String entityName, EntityXmlMappingData xmlMappingData,
-                  boolean firstPass) {
+                  VersionsJoinTable joinTable, boolean firstPass) {
         Type type = value.getType();
 
         if (type instanceof ComponentType) {
@@ -166,7 +167,7 @@
             // only second pass
             if (!firstPass) {
                 collectionMetadataGenerator.addCollection(name, (Collection) value, currentMapper, entityName,
-                        xmlMappingData);
+                        xmlMappingData, joinTable);
             }
         } else {
             String message = "Type not supported for versioning: " + type.getClass().getName() +
@@ -181,16 +182,17 @@
 
     @SuppressWarnings({"unchecked"})
     private void addProperties(Element parent, Iterator<Property> properties, CompositeMapperBuilder currentMapper,
-                               PropertyStoreInfo propertyStoreInfo, String entityName, EntityXmlMappingData xmlMappingData,
-                               List<String> unversionedProperties, boolean firstPass) {
+                               PersistentClassVersioningData versioningData, String entityName, EntityXmlMappingData xmlMappingData,
+                               boolean firstPass) {
         while (properties.hasNext()) {
             Property property = properties.next();
             if (!"_identifierMapper".equals(property.getName())) {
-                ModificationStore store = getStoreForProperty(property, propertyStoreInfo, unversionedProperties);
+                ModificationStore store = getStoreForProperty(property, versioningData.propertyStoreInfo,
+                        versioningData.unversionedProperties);
 
                 if (store != null) {
                     addValue(parent, property.getName(), property.getValue(), currentMapper, store, entityName,
-                            xmlMappingData, firstPass);
+                            xmlMappingData, versioningData.versionsJoinTables.get(property.getName()), firstPass);
                 }
             }
         }
@@ -214,12 +216,12 @@
                 versionedTableName = verEntCfg.getVersionsEntityName(originalTableName);
             }
 
-            String schema = versioningData.schema;
+            String schema = versioningData.versionsTable.schema();
             if (StringTools.isEmpty(schema)) {
                 schema = join.getTable().getSchema();
             }
 
-            String catalog = versioningData.catalog;
+            String catalog = versioningData.versionsTable.catalog();
             if (StringTools.isEmpty(catalog)) {
                 catalog = join.getTable().getCatalog();
             }
@@ -234,17 +236,16 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PropertyStoreInfo propertyStoreInfo,
-                          String entityName, EntityXmlMappingData xmlMappingData, List<String> unversionedProperties,
-                          boolean firstPass) {
+    private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PersistentClassVersioningData versioningData,
+                          String entityName, EntityXmlMappingData xmlMappingData,boolean firstPass) {
         Iterator<Join> joins = pc.getJoinIterator();
 
         while (joins.hasNext()) {
             Join join = joins.next();
             Element joinElement = entitiesJoins.get(entityName).get(join);
 
-            addProperties(joinElement, join.getPropertyIterator(), currentMapper, propertyStoreInfo, entityName,
-                    xmlMappingData, unversionedProperties, firstPass);
+            addProperties(joinElement, join.getPropertyIterator(), currentMapper, versioningData, entityName,
+                    xmlMappingData, firstPass);
         }
     }
 
@@ -264,12 +265,12 @@
     @SuppressWarnings({"unchecked"})
     public void generateFirstPass(PersistentClass pc, PersistentClassVersioningData versioningData,
                                   EntityXmlMappingData xmlMappingData) {
-        String schema = versioningData.schema;
+        String schema = versioningData.versionsTable.schema();
         if (StringTools.isEmpty(schema)) {
             schema = pc.getTable().getSchema();
         }
 
-        String catalog = versioningData.catalog;
+        String catalog = versioningData.versionsTable.catalog();
         if (StringTools.isEmpty(catalog)) {
             catalog = pc.getTable().getCatalog();
         }
@@ -335,13 +336,12 @@
 
         // Mapping unjoined properties
         addProperties(class_mapping, (Iterator<Property>) pc.getUnjoinedPropertyIterator(), propertyMapper,
-                versioningData.propertyStoreInfo, pc.getEntityName(), xmlMappingData, versioningData.unversionedProperties,
+                versioningData, pc.getEntityName(), xmlMappingData,
                 true);
 
         // Creating and mapping joins (first pass)
         createJoins(pc, class_mapping, versioningData);
-        addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, pc.getEntityName(), xmlMappingData,
-                versioningData.unversionedProperties, true);
+        addJoins(pc, propertyMapper, versioningData, pc.getEntityName(), xmlMappingData, true);
 
         // Storing the generated configuration
         EntityConfiguration entityCfg = new EntityConfiguration(entityName, versionsEntityName, idMapper,
@@ -363,12 +363,10 @@
         }
 
         addProperties(parent, (Iterator<Property>) pc.getUnjoinedPropertyIterator(),
-                propertyMapper, versioningData.propertyStoreInfo, entityName, xmlMappingData,
-                versioningData.unversionedProperties, false);
+                propertyMapper, versioningData, entityName, xmlMappingData, false);
 
         // Mapping joins (second pass)
-        addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName, xmlMappingData,
-                versioningData.unversionedProperties, false);
+        addJoins(pc, propertyMapper, versioningData, entityName, xmlMappingData, false);
     }
 
     public Map<String, EntityConfiguration> getEntitiesConfigurations() {

Copied: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java (from rev 148, trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetRefCollEntity.java)
===================================================================
--- trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java	                        (rev 0)
+++ trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -0,0 +1,87 @@
+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.JoinColumn;
+import java.util.Set;
+
+/**
+ * A detached relation to another entity, with a @OneToMany+ at JoinColumn mapping.
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class SetJoinColumnRefCollEntity {
+    @Id
+    private Integer id;
+
+    @Versioned
+    private String data;
+
+    @Versioned
+    @OneToMany
+    @JoinColumn(name = "SJCR_ID")
+    private Set<StrTestEntity> collection;
+
+    public SetJoinColumnRefCollEntity() {
+    }
+
+    public SetJoinColumnRefCollEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    public SetJoinColumnRefCollEntity(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<StrTestEntity> getCollection() {
+        return collection;
+    }
+
+    public void setCollection(Set<StrTestEntity> collection) {
+        this.collection = collection;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof SetJoinColumnRefCollEntity)) return false;
+
+        SetJoinColumnRefCollEntity that = (SetJoinColumnRefCollEntity) 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 "SetJoinColumnRefCollEntity(id = " + id + ", data = " + data + ")";
+    }
+}
\ No newline at end of file


Property changes on: trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Modified: trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java
===================================================================
--- trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java	2008-09-22 09:48:53 UTC (rev 158)
+++ trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -75,11 +75,10 @@
         assert "data1".equals(rev2.getData());
     }
 
-    private final static String MIDDLE_VERSIONS_ENTITY_NAME =
-            "UNI_NAMING_TEST_versions";
+    private final static String MIDDLE_VERSIONS_ENTITY_NAME = "UNI_NAMING_TEST_versions";
     @Test
     public void testTableName() {
-        assert "UNI_NAMING_TEST_versions".equals(
+        assert MIDDLE_VERSIONS_ENTITY_NAME.equals(
                 getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getName());
     }
 

Copied: trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java (from rev 152, trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java)
===================================================================
--- trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java	                        (rev 0)
+++ trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -0,0 +1,108 @@
+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 VersionsJoinTableNaming extends AbstractEntityTest {
+    private Integer uni1_id;
+    private Integer str1_id;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(VersionsJoinTableTestEntity.class);
+        cfg.addAnnotatedClass(StrTestEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        VersionsJoinTableTestEntity uni1 = new VersionsJoinTableTestEntity(1, "data1");
+        StrTestEntity str1 = new StrTestEntity("str1");
+
+        // Revision 1
+        EntityManager em = getEntityManager();
+        em.getTransaction().begin();
+
+        uni1.setCollection(new HashSet<StrTestEntity>());
+        em.persist(uni1);
+        em.persist(str1);
+
+        em.getTransaction().commit();
+
+        // Revision 2
+        em.getTransaction().begin();
+
+        uni1 = em.find(VersionsJoinTableTestEntity.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(VersionsJoinTableTestEntity.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);
+
+        VersionsJoinTableTestEntity rev1 = getVersionsReader().find(VersionsJoinTableTestEntity.class, uni1_id, 1);
+        VersionsJoinTableTestEntity rev2 = getVersionsReader().find(VersionsJoinTableTestEntity.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());
+    }
+
+    private final static String MIDDLE_VERSIONS_ENTITY_NAME = "VERSIONS_JOIN_TABLE_TEST";
+    
+    @Test
+    public void testTableName() {
+        assert MIDDLE_VERSIONS_ENTITY_NAME.equals(
+                getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getName());
+    }
+
+    @SuppressWarnings({"unchecked"})
+    @Test
+    public void testJoinColumnName() {
+        Iterator<Column> columns =
+                getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getColumnIterator();
+
+        boolean id1Found = false;
+        boolean id2Found = false;
+
+        while (columns.hasNext()) {
+            Column column = columns.next();
+            if ("VJT_ID".equals(column.getName())) {
+                id1Found = true;
+            }
+
+            if ("STR_ID".equals(column.getName())) {
+                id2Found = true;
+            }
+        }
+
+        assert id1Found && id2Found;
+    }
+}
\ No newline at end of file


Property changes on: trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java (from rev 148, trunk/src/test/org/jboss/envers/test/integration/naming/DetachedNamingTestEntity.java)
===================================================================
--- trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java	                        (rev 0)
+++ trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -0,0 +1,85 @@
+package org.jboss.envers.test.integration.naming;
+
+import org.jboss.envers.Versioned;
+import org.jboss.envers.VersionsJoinTable;
+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 VersionsJoinTableTestEntity {
+    @Id
+    private Integer id;
+
+    @Versioned
+    private String data;
+
+    @Versioned
+    @OneToMany
+    @JoinColumn(name = "VJT_ID")
+    @VersionsJoinTable(name = "VERSIONS_JOIN_TABLE_TEST", inverseJoinColumns = @JoinColumn(name = "STR_ID"))
+    private Set<StrTestEntity> collection;
+
+    public VersionsJoinTableTestEntity() {
+    }
+
+    public VersionsJoinTableTestEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    public VersionsJoinTableTestEntity(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<StrTestEntity> getCollection() {
+        return collection;
+    }
+
+    public void setCollection(Set<StrTestEntity> collection) {
+        this.collection = collection;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof VersionsJoinTableTestEntity)) return false;
+
+        VersionsJoinTableTestEntity that = (VersionsJoinTableTestEntity) 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 "VersionsJoinTableTestEntity(id = " + id + ", data = " + data + ")";
+    }
+}
\ No newline at end of file


Property changes on: trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java (from rev 156, trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicDetachedSet.java)
===================================================================
--- trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java	                        (rev 0)
+++ trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java	2008-09-22 11:26:24 UTC (rev 159)
@@ -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.StrTestEntity;
+import org.jboss.envers.test.entities.onetomany.detached.SetJoinColumnRefCollEntity;
+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 BasicJoinColumnSet 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(SetJoinColumnRefCollEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+
+        StrTestEntity str1 = new StrTestEntity("str1");
+        StrTestEntity str2 = new StrTestEntity("str2");
+
+        SetJoinColumnRefCollEntity coll1 = new SetJoinColumnRefCollEntity(3, "coll1");
+
+        // Revision 1
+        em.getTransaction().begin();
+
+        em.persist(str1);
+        em.persist(str2);
+
+        coll1.setCollection(new HashSet<StrTestEntity>());
+        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(SetJoinColumnRefCollEntity.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(SetJoinColumnRefCollEntity.class, coll1.getId());
+
+        coll1.getCollection().remove(str1);
+
+        em.getTransaction().commit();
+
+        // Revision 4
+        em.getTransaction().begin();
+
+        coll1 = em.find(SetJoinColumnRefCollEntity.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(SetJoinColumnRefCollEntity.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);
+
+        SetJoinColumnRefCollEntity rev1 = getVersionsReader().find(SetJoinColumnRefCollEntity.class, coll1_id, 1);
+        SetJoinColumnRefCollEntity rev2 = getVersionsReader().find(SetJoinColumnRefCollEntity.class, coll1_id, 2);
+        SetJoinColumnRefCollEntity rev3 = getVersionsReader().find(SetJoinColumnRefCollEntity.class, coll1_id, 3);
+        SetJoinColumnRefCollEntity rev4 = getVersionsReader().find(SetJoinColumnRefCollEntity.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/detached/BasicJoinColumnSet.java
___________________________________________________________________
Name: svn:mergeinfo
   + 




More information about the jboss-envers-commits mailing list