Hibernate SVN: r16012 - validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2009-02-20 11:46:58 -0500 (Fri, 20 Feb 2009)
New Revision: 16012
Added:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Optional.java
Modified:
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java
Log:
Added test for HV-85
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-20 16:11:57 UTC (rev 16011)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-20 16:46:58 UTC (rev 16012)
@@ -19,8 +19,10 @@
import java.util.HashSet;
import java.util.Set;
+import java.util.Iterator;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
+import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;
import static org.junit.Assert.assertEquals;
@@ -31,10 +33,12 @@
import org.hibernate.validation.eg.Book;
import org.hibernate.validation.eg.DefaultAlias;
import org.hibernate.validation.eg.Dictonary;
+import org.hibernate.validation.eg.FrenchAddress;
import org.hibernate.validation.eg.groups.First;
import org.hibernate.validation.eg.groups.Last;
import org.hibernate.validation.eg.groups.Second;
import org.hibernate.validation.util.TestUtil;
+import static org.hibernate.validation.util.TestUtil.assertConstraintViolation;
/**
* Tests for the group and group sequence feature.
@@ -209,13 +213,15 @@
assertEquals(
"There should be one violation against Billable",
1,
- constraintViolations.size() );
+ constraintViolations.size()
+ );
constraintViolations = validator.validate( user, Default.class, Billable.class );
assertEquals(
"There should be 3 violation against Default and Billable",
3,
- constraintViolations.size() );
+ constraintViolations.size()
+ );
constraintViolations = validator.validate( user, BuyInOneClick.class );
assertEquals(
@@ -252,4 +258,41 @@
constraintViolations.size()
);
}
+
+ @Test
+ public void testGroupSequenceFollowedByGroup() {
+ User user = new User();
+ user.setFirstname( "Foo" );
+ user.setLastname( "Bar" );
+ user.setPhoneNumber( "+46 123-456" );
+
+ Validator validator = TestUtil.getValidator();
+
+ Set<ConstraintViolation<User>> constraintViolations = validator.validate(
+ user, BuyInOneClick.class, Optional.class
+ );
+ assertEquals(
+ "There should be two violations against the implicit default group",
+ 2,
+ constraintViolations.size()
+ );
+
+ Iterator<ConstraintViolation<User>> iter = constraintViolations.iterator();
+
+ assertConstraintViolation(
+ iter.next(),
+ "may not be null",
+ User.class,
+ null,
+ "defaultCreditCard"
+ );
+
+ assertConstraintViolation(
+ iter.next(),
+ "must match \"[0-9 -]?\"",
+ User.class,
+ "+46 123-456",
+ "phoneNumber"
+ );
+ }
}
\ No newline at end of file
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Optional.java (from rev 16006, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Billable.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Optional.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Optional.java 2009-02-20 16:46:58 UTC (rev 16012)
@@ -0,0 +1,9 @@
+package org.hibernate.validation.engine.groups;
+
+/**
+ * Validation group checking whether user is billable.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface Optional {
+}
\ No newline at end of file
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java 2009-02-20 16:11:57 UTC (rev 16011)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java 2009-02-20 16:46:58 UTC (rev 16012)
@@ -3,6 +3,8 @@
import javax.validation.constraints.NotNull;
import javax.validation.groups.Default;
+import org.hibernate.validation.constraints.Pattern;
+
/**
* @author Emmanuel Bernard
* @author Hardy Ferentschik
@@ -14,6 +16,9 @@
@NotNull(groups = Default.class)
private String lastname;
+ @Pattern(regex = "[0-9 -]?", groups = Optional.class)
+ private String phoneNumber;
+
@NotNull(groups = { Billable.class, BuyInOneClick.class })
private CreditCard defaultCreditCard;
@@ -40,4 +45,12 @@
public void setDefaultCreditCard(CreditCard defaultCreditCard) {
this.defaultCreditCard = defaultCreditCard;
}
+
+ public String getPhoneNumber() {
+ return phoneNumber;
+ }
+
+ public void setPhoneNumber(String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
}
\ No newline at end of file
16 years, 7 months
Hibernate SVN: r16011 - in branches/Branch_3_2/HibernateExt/tools: src/java/org/hibernate and 6 other directories.
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2009-02-20 11:11:57 -0500 (Fri, 20 Feb 2009)
New Revision: 16011
Added:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java
Modified:
branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd
branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml
branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java
Log:
HBX-623 provide cascade control in reveng.xml
+ fix bugs in one-to-one/inverse-one-to-one handling with respect to naming.
Modified: branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties 2009-02-20 16:11:57 UTC (rev 16011)
@@ -18,6 +18,7 @@
log4j.logger.org.hibernate.cfg.SettingsFactory=warn
log4j.logger.org.hibernate.cfg.reveng=debug
log4j.logger.org.hibernate.cfg.JDBCMetaDataConfiguration=debug
+log4j.logger.org.hibernate.cfg.JDBCBinder=debug
#log4j.logger.freemarker=debug
### log just the SQL
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -22,6 +22,8 @@
import org.hibernate.FetchMode;
import org.hibernate.MappingException;
import org.hibernate.cfg.reveng.DatabaseCollector;
+import org.hibernate.cfg.reveng.ForeignKeyCollectionInfo;
+import org.hibernate.cfg.reveng.AssociationInfo;
import org.hibernate.cfg.reveng.JDBCReader;
import org.hibernate.cfg.reveng.JDBCToHibernateTypeHelper;
import org.hibernate.cfg.reveng.MappingsDatabaseCollector;
@@ -45,6 +47,7 @@
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;
+import org.hibernate.mapping.ToOne;
import org.hibernate.mapping.Value;
import org.hibernate.type.ForeignKeyDirection;
import org.hibernate.type.Type;
@@ -239,9 +242,9 @@
foreignKey.getColumns(),
TableIdentifier.create(foreignKey.getReferencedTable() ),
foreignKey.getReferencedColumns())) {
- log.debug("Rev.eng excluded one-to-many for foreignkey " + foreignKey.getName());
+ log.debug("Rev.eng excluded one-to-many or one-to-one for foreignkey " + foreignKey.getName());
} else if (revengStrategy.isOneToOne(foreignKey)){
- Property property = bindOneToOne(rc, foreignKey.getTable(), foreignKey, processed, false);
+ Property property = bindOneToOne(rc, foreignKey.getTable(), foreignKey, processed, false, true);
rc.addProperty(property);
} else {
Property property = bindOneToMany(rc, foreignKey, processed, mapping);
@@ -253,7 +256,7 @@
private Property bindOneToOne(PersistentClass rc, Table targetTable,
- ForeignKey fk, Set processedColumns, boolean constrained) {
+ ForeignKey fk, Set processedColumns, boolean constrained, boolean inverseProperty) {
OneToOne value = new OneToOne(targetTable, rc);
@@ -261,11 +264,18 @@
.tableToClassName(TableIdentifier.create(targetTable)));
boolean isUnique = isUniqueReference(fk);
- String propertyName =
- revengStrategy.foreignKeyToEntityName(fk.getName(),
+ String propertyName = null;
+ if(inverseProperty) {
+ propertyName = revengStrategy.foreignKeyToInverseEntityName(fk.getName(),
+ TableIdentifier.create(fk.getReferencedTable()), fk
+ .getReferencedColumns(), TableIdentifier
+ .create(targetTable), fk.getColumns(), isUnique);
+ } else {
+ propertyName = revengStrategy.foreignKeyToEntityName(fk.getName(),
TableIdentifier.create(fk.getReferencedTable()), fk
.getReferencedColumns(), TableIdentifier
.create(targetTable), fk.getColumns(), isUnique);
+ }
Iterator columns = fk.getColumnIterator();
while (columns.hasNext()) {
@@ -282,11 +292,14 @@
ForeignKeyDirection.FOREIGN_KEY_FROM_PARENT :
ForeignKeyDirection.FOREIGN_KEY_TO_PARENT );
- return makeProperty(TableIdentifier.create(targetTable), propertyName, value,
- true, true, value.getFetchMode() != FetchMode.JOIN, null, null);
+
+ return makeEntityProperty(propertyName, true, targetTable, fk, value, inverseProperty);
+ //return makeProperty(TableIdentifier.create(targetTable), propertyName, value,
+ // true, true, value.getFetchMode() != FetchMode.JOIN, null, null);
}
/**
+ * @param mutable
* @param table
* @param fk
* @param columnsToBind
@@ -294,7 +307,7 @@
* @param rc
* @param propName
*/
- private Property bindManyToOne(String propertyName, Table table, ForeignKey fk, Set processedColumns) {
+ private Property bindManyToOne(String propertyName, boolean mutable, Table table, ForeignKey fk, Set processedColumns) {
ManyToOne value = new ManyToOne(table);
value.setReferencedEntityName( fk.getReferencedEntityName() );
Iterator columns = fk.getColumnIterator();
@@ -304,10 +317,84 @@
value.addColumn(fkcolumn);
processedColumns.add(fkcolumn);
}
- value.setFetchMode(FetchMode.SELECT);
- return makeProperty(TableIdentifier.create( table ), propertyName, value, true, true, value.getFetchMode()!=FetchMode.JOIN, null, null);
+ value.setFetchMode(FetchMode.SELECT);
+
+ return makeEntityProperty(propertyName, mutable, table, fk, value, false);
}
+ private Property makeCollectionProperty(String propertyName, boolean mutable,
+ Table table, ForeignKey fk, Collection value, boolean inverseProperty) {
+ AssociationInfo fkei = inverseProperty?revengStrategy.foreignKeyToInverseAssociationInfo(fk):revengStrategy.foreignKeyToAssociationInfo(fk);
+
+ String fetchMode = null;
+ String cascade = null;
+ boolean update = mutable;
+ boolean insert = mutable;
+
+ if(fkei != null){
+ cascade = fkei.getCascade();
+ if(fkei.getUpdate()!=null) {
+ update = fkei.getUpdate().booleanValue();
+ }
+ if(fkei.getInsert()!=null) {
+ insert = fkei.getInsert().booleanValue();
+ }
+
+ fetchMode = fkei.getFetch();
+
+
+ }
+
+ if(FetchMode.JOIN.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.JOIN);
+ }
+ else if(FetchMode.SELECT.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+ else {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+
+ return makeProperty(TableIdentifier.create( table ), propertyName, value, insert, update, value.getFetchMode()!=FetchMode.JOIN, cascade, null);
+
+ }
+
+ private Property makeEntityProperty(String propertyName, boolean mutable,
+ Table table, ForeignKey fk, ToOne value, boolean inverseProperty) {
+ AssociationInfo fkei = inverseProperty?revengStrategy.foreignKeyToInverseAssociationInfo(fk):revengStrategy.foreignKeyToAssociationInfo(fk);
+
+ String fetchMode = null;
+ String cascade = null;
+ boolean update = mutable;
+ boolean insert = mutable;
+
+ if(fkei != null){
+ cascade = fkei.getCascade();
+ if(fkei.getUpdate()!=null) {
+ update = fkei.getUpdate().booleanValue();
+ }
+ if(fkei.getInsert()!=null) {
+ insert = fkei.getInsert().booleanValue();
+ }
+
+ fetchMode = fkei.getFetch();
+
+
+ }
+
+ if(FetchMode.JOIN.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.JOIN);
+ }
+ else if(FetchMode.SELECT.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+ else {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+
+ return makeProperty(TableIdentifier.create( table ), propertyName, value, insert, update, value.getFetchMode()!=FetchMode.JOIN, cascade, null);
+ }
+
/**
* @param rc
* @param processed
@@ -326,7 +413,7 @@
boolean manyToMany = revengStrategy.isManyToManyTable( collectionTable );
if(manyToMany) {
- log.debug("Rev.eng said here is a many-to-many");
+ //log.debug("Rev.eng said here is a many-to-many");
// TODO: handle "the other side should influence the name"
}
@@ -395,10 +482,13 @@
mappings.addCollection(collection);
- return makeProperty(TableIdentifier.create( rc.getTable() ), StringHelper.unqualify( collection.getRole() ), collection, true, true, true, "all", null); // TODO: cascade isn't all by default
+ return makeCollectionProperty(StringHelper.unqualify( collection.getRole() ), true, rc.getTable(), foreignKey, collection, true);
+ //return makeProperty(TableIdentifier.create( rc.getTable() ), StringHelper.unqualify( collection.getRole() ), collection, true, true, true, "none", null); // TODO: cascade isn't all by default
+
}
+
private String bindCollection(PersistentClass rc, ForeignKey fromForeignKey, ForeignKey toForeignKey, Collection collection) {
ForeignKey targetKey = fromForeignKey;
String collectionRole = null;
@@ -458,8 +548,8 @@
collection.setInverse(collectionInverse); // TODO: allow overriding this
collection.setLazy(collectionLazy);
collection.setFetchMode(FetchMode.SELECT);
+
-
return tableToClassName;
}
@@ -583,9 +673,9 @@
TableIdentifier.create(foreignKey.getReferencedTable() ),
foreignKey.getReferencedColumns())) {
// TODO: if many-to-one is excluded should the column be marked as processed so it won't show up at all ?
- log.debug("Rev.eng excluded many-to-one for foreignkey " + foreignKey.getName());
+ log.debug("Rev.eng excluded *-to-one for foreignkey " + foreignKey.getName());
} else if (revengStrategy.isOneToOne(foreignKey)){
- Property property = bindOneToOne(rc, foreignKey.getReferencedTable(), foreignKey, processedColumns, true);
+ Property property = bindOneToOne(rc, foreignKey.getReferencedTable(), foreignKey, processedColumns, true, false);
rc.addProperty(property);
} else {
boolean isUnique = isUniqueReference(foreignKey);
@@ -599,13 +689,12 @@
);
Property property = bindManyToOne(
- makeUnique(rc, propertyName),
+ makeUnique(rc, propertyName),
+ mutable,
table,
foreignKey,
processedColumns
);
- property.setUpdateable(mutable);
- property.setInsertable(mutable);
rc.addProperty(property);
}
@@ -816,7 +905,7 @@
TableIdentifier.create(foreignKey.getTable() ),
foreignKey.getColumns(), TableIdentifier.create(foreignKey.getReferencedTable() ), foreignKey.getReferencedColumns(), true
);
- property = bindManyToOne( makeUnique(pkc, propertyName), table, foreignKey, processedColumns);
+ property = bindManyToOne( makeUnique(pkc, propertyName), true, table, foreignKey, processedColumns);
processedColumns.addAll(fkfc.columns);
}
else {
Added: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -0,0 +1,12 @@
+package org.hibernate.cfg.reveng;
+
+public interface AssociationInfo {
+
+ String getCascade();
+
+ String getFetch();
+
+ Boolean getUpdate();
+ Boolean getInsert();
+
+}
Added: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -0,0 +1,35 @@
+package org.hibernate.cfg.reveng;
+
+public class DefaulAssociationInfo implements AssociationInfo {
+
+ String cascade;
+ String fetch;
+ Boolean insert;
+ Boolean update;
+
+ public String getCascade() {
+ return cascade;
+ }
+ public void setCascade(String cascade) {
+ this.cascade = cascade;
+ }
+ public String getFetch() {
+ return fetch;
+ }
+ public void setFetch(String fetch) {
+ this.fetch = fetch;
+ }
+ public Boolean getInsert() {
+ return insert;
+ }
+ public void setInsert(Boolean insert) {
+ this.insert = insert;
+ }
+ public Boolean getUpdate() {
+ return update;
+ }
+ public void setUpdate(Boolean update) {
+ this.update = update;
+ }
+
+}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -79,6 +79,14 @@
return ReverseEngineeringStrategyUtil.simplePluralize(singular);
}
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable, List referencedColumnNames,
+ boolean uniqueReference) {
+ return foreignKeyToEntityName(keyname, fromTable, fromColumnNames, referencedTable, referencedColumnNames, uniqueReference);
+ }
+
+
public String foreignKeyToEntityName(String keyname, TableIdentifier fromTable, List fromColumnNames, TableIdentifier referencedTable, List referencedColumnNames, boolean uniqueReference) {
String propertyName = Introspector.decapitalize( StringHelper.unqualify( getRoot().tableToClassName(referencedTable) ) );
@@ -339,5 +347,15 @@
public Map columnToMetaAttributes(TableIdentifier identifier, String column) {
return null;
}
+
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ return null;
+ }
+
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ return null;
+ }
+
+
}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -137,6 +137,21 @@
public Map columnToMetaAttributes(TableIdentifier identifier, String column) {
return delegate==null?null:delegate.columnToMetaAttributes( identifier, column );
+ }
+
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ return delegate==null?null:delegate.foreignKeyToAssociationInfo(foreignKey);
+ }
+
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ return delegate==null?null:delegate.foreignKeyToInverseAssociationInfo(foreignKey);
+ }
+
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable, List referencedColumnNames,
+ boolean uniqueReference) {
+ return delegate==null?null:delegate.foreignKeyToInverseEntityName(keyname, fromTable, fromColumnNames, referencedTable, referencedColumnNames, uniqueReference);
}
}
Added: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -0,0 +1,16 @@
+package org.hibernate.cfg.reveng;
+
+public interface ForeignKeyCollectionInfo {
+
+ String getCascade();
+
+ String getFetch();
+
+ Boolean getUpdate();
+ Boolean getInsert();
+
+ String getLazy();
+
+}
+
+
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -47,6 +47,37 @@
}
+ static boolean bindManyToOneAndCollection(Element element, String constraintName, OverrideRepository repository) {
+
+ String manyToOneProperty = null;
+ Boolean excludeManyToOne = null;
+
+ DefaulAssociationInfo associationInfo = null;
+ DefaulAssociationInfo inverseAssociationInfo = null;
+ Element manyToOne = element.element("many-to-one");
+ if(manyToOne!=null) {
+ manyToOneProperty = manyToOne.attributeValue("property");
+ excludeManyToOne = BooleanValue(manyToOne.attributeValue("exclude"));
+ associationInfo = extractAssociationInfo(manyToOne);
+ }
+
+ String collectionProperty = null;
+ Boolean excludeCollection = null;
+ Element collection = element.element("set");
+ if(collection!=null) {
+ collectionProperty = collection.attributeValue("property");
+ excludeCollection = BooleanValue(collection.attributeValue("exclude"));
+ inverseAssociationInfo = extractAssociationInfo(collection);
+ }
+
+ if ( (manyToOne!=null) || (collection!=null) ) {
+ repository.addForeignKeyInfo(constraintName, manyToOneProperty, excludeManyToOne, collectionProperty, excludeCollection, associationInfo, inverseAssociationInfo);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
private static void bindSchemaSelection(List selection, OverrideRepository repository) {
Iterator iterator = selection.iterator();
@@ -162,66 +193,100 @@
if(StringHelper.isNotEmpty(constraintName)) {
if (!validateFkAssociations(element))
throw new IllegalArgumentException("you can't mix <many-to-one/> or <set/> with <(inverse-)one-to-one/> ");
- String manyToOneProperty = null;
- Boolean excludeManyToOne = null;
- Element manyToOne = element.element("many-to-one");
- if(manyToOne!=null) {
- manyToOneProperty = manyToOne.attributeValue("property");
- excludeManyToOne = BooleanValue(manyToOne.attributeValue("exclude"));
- }
-
- String collectionProperty = null;
- Boolean excludeCollection = null;
- Element collection = element.element("set");
- if(collection!=null) {
- collectionProperty = collection.attributeValue("property");
- excludeCollection = BooleanValue(collection.attributeValue("exclude"));
- }
-
- if ( (manyToOne!=null) || (collection!=null) ) {
- repository.addForeignKeyInfo(constraintName, manyToOneProperty, excludeManyToOne, collectionProperty, excludeCollection);
- continue;
- }
-
- String oneToOneProperty = null;
- Boolean excludeOneToOne = null;
- Element oneToOne = element.element("one-to-one");
- if(oneToOne!=null) {
- oneToOneProperty = oneToOne.attributeValue("property");
- excludeOneToOne = BooleanValue(oneToOne.attributeValue("exclude"));
- }
-
- String inverseOneToOneProperty = null;
- Boolean excludeInverseOneToOne = null;
- Element inverseOneToOne = element.element("inverse-one-to-one");
- if(inverseOneToOne!=null) {
- inverseOneToOneProperty = oneToOne.attributeValue("property");
- excludeInverseOneToOne = BooleanValue(inverseOneToOne.attributeValue("exclude"));
- }
-
- // having oneToOne = null and inverseOneToOne != null doesn't make sense
- // we cannot have the inserse side without the owning side in this case
-
- if ( (oneToOne!=null) ) {
- repository.addForeignKeyInfo(constraintName, oneToOneProperty, excludeOneToOne, inverseOneToOneProperty, excludeInverseOneToOne);
- }
+ if(!bindManyToOneAndCollection(element, constraintName, repository)) {
+ bindOneToOne(element, constraintName, repository);
+ }
}
}
}
+ private static void bindOneToOne(Element element, String constraintName,
+ OverrideRepository repository) {
+ String oneToOneProperty = null;
+ Boolean excludeOneToOne = null;
+ Element oneToOne = element.element("one-to-one");
+ DefaulAssociationInfo associationInfo = null;
+ if(oneToOne!=null) {
+ oneToOneProperty = oneToOne.attributeValue("property");
+ excludeOneToOne = BooleanValue(oneToOne.attributeValue("exclude"));
+ associationInfo = extractAssociationInfo(oneToOne);
+ }
+
+ String inverseOneToOneProperty = null;
+ Boolean excludeInverseOneToOne = null;
+ Element inverseOneToOne = element.element("inverse-one-to-one");
+ DefaulAssociationInfo inverseAssociationInfo = null;
+ if(inverseOneToOne!=null) {
+ inverseOneToOneProperty = inverseOneToOne.attributeValue("property");
+ excludeInverseOneToOne = BooleanValue(inverseOneToOne.attributeValue("exclude"));
+ inverseAssociationInfo = extractAssociationInfo(inverseOneToOne);
+ }
+
+ // having oneToOne = null and inverseOneToOne != null doesn't make sense
+ // we cannot have the inverse side without the owning side in this case
+
+ if ( (oneToOne!=null) ) {
+ repository.addForeignKeyInfo(constraintName, oneToOneProperty, excludeOneToOne, inverseOneToOneProperty, excludeInverseOneToOne, associationInfo, inverseAssociationInfo);
+ }
+ }
+
+ private static DefaulAssociationInfo extractAssociationInfo(Element manyToOne) {
+ String attributeValue = manyToOne.attributeValue("cascade");
+ DefaulAssociationInfo associationInfo = null;
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setCascade(attributeValue);
+ }
+
+
+ attributeValue = manyToOne.attributeValue("fetch");
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setFetch(attributeValue);
+ }
+
+
+ attributeValue = manyToOne.attributeValue("insert");
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setInsert(new Boolean(attributeValue));
+ }
+
+
+ attributeValue = manyToOne.attributeValue("update");
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setUpdate(new Boolean(attributeValue));
+ }
+ return associationInfo;
+ }
+
+ private static DefaulAssociationInfo ensureInit(
+ DefaulAssociationInfo associationInfo) {
+ return associationInfo==null?new DefaulAssociationInfo():associationInfo;
+ }
+
private static boolean validateFkAssociations(Element element){
Element manyToOne = element.element("many-to-one");
Element oneToOne = element.element("one-to-one");
Element set = element.element("set");
Element inverseOneToOne = element.element("inverse-one-to-one");
- if (manyToOne != null && ( oneToOne != null || inverseOneToOne != null)
- || oneToOne != null && set != null
- || inverseOneToOne != null && set != null)
+ if((manyToOne != null) && ( (oneToOne != null) || (inverseOneToOne != null))) {
return false;
+
+ }
+
+ if((oneToOne != null) && (set != null)) {
+ return false;
+ }
+ if ((inverseOneToOne != null) && (set != null)) {
+ return false;
+ }
+
return true;
}
@@ -384,6 +449,7 @@
String getMatchString(String input) {
return input.toUpperCase();
}
+
}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -69,6 +69,9 @@
final private Map foreignKeyInverseExclude;
final private Map foreignKeyToOneExclude;
+
+ final private Map foreignKeyToEntityInfo;
+ final private Map foreignKeyToInverseEntityInfo;
final private Map tableMetaAttributes; // TI -> MultiMap of SimpleMetaAttributes
@@ -102,6 +105,8 @@
foreignKeyToOneExclude = new HashMap();
tableMetaAttributes = new HashMap();
columnMetaAttributes = new HashMap();
+ foreignKeyToEntityInfo = new HashMap();
+ foreignKeyToInverseEntityInfo = new HashMap();
}
public OverrideRepository addFile(File xmlFile) {
@@ -426,6 +431,20 @@
}
}
+ @Override
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable,
+ List referencedColumnNames, boolean uniqueReference) {
+
+ String property = (String) foreignKeyToInverseName.get(keyname);
+ if(property==null) {
+ return super.foreignKeyToInverseEntityName(keyname, fromTable, fromColumnNames, referencedTable, referencedColumnNames, uniqueReference);
+ } else {
+ return property;
+ }
+ }
+
public String foreignKeyToCollectionName(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns, boolean uniqueReference) {
String property = (String) foreignKeyToInverseName.get(keyname);
if(property==null) {
@@ -454,6 +473,25 @@
referencedTable, referencedColumns );
}
}
+
+
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ AssociationInfo fkei = (AssociationInfo) foreignKeyToInverseEntityInfo.get(foreignKey.getName());
+ if(fkei!=null) {
+ return fkei;
+ } else {
+ return super.foreignKeyToInverseAssociationInfo(foreignKey);
+ }
+ }
+
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ AssociationInfo fkei = (AssociationInfo) foreignKeyToEntityInfo.get(foreignKey.getName());
+ if(fkei!=null) {
+ return fkei;
+ } else {
+ return super.foreignKeyToAssociationInfo(foreignKey);
+ }
+ }
};
}
@@ -609,7 +647,7 @@
* the owning side can generate a toOne (ManyToOne or OneToOne), we call this side foreignKeyToOne
* the inverse side can generate a OneToMany OR a OneToOne (in case we have a pure bidirectional OneToOne, we call this side foreignKeyToInverse
*/
- public void addForeignKeyInfo(String constraintName, String toOneProperty, Boolean excludeToOne, String inverseProperty, Boolean excludeInverse) {
+ public void addForeignKeyInfo(String constraintName, String toOneProperty, Boolean excludeToOne, String inverseProperty, Boolean excludeInverse, AssociationInfo associationInfo, AssociationInfo inverseAssociationInfo) {
if(StringHelper.isNotEmpty(toOneProperty)) {
foreignKeyToOneName.put(constraintName, toOneProperty);
}
@@ -622,6 +660,13 @@
if(excludeToOne!=null) {
foreignKeyToOneExclude.put(constraintName, excludeToOne);
}
+ if(associationInfo!=null) {
+ foreignKeyToEntityInfo.put(constraintName, associationInfo);
+ }
+ if(inverseAssociationInfo!=null) {
+ foreignKeyToInverseEntityInfo.put(constraintName, inverseAssociationInfo);
+ }
+
}
public void addMetaAttributeInfo(Table table, Map map) {
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -166,6 +166,16 @@
*/
public String foreignKeyToEntityName(String keyname, TableIdentifier fromTable, List fromColumnNames, TableIdentifier referencedTable, List referencedColumnNames, boolean uniqueReference);
+ /**
+ * Used to rename the inverse one-to-one properties.
+ *
+ * @param fromColumns list of Column instances on the fromTable. Only col.getName() should be assumed to be correct
+ * @param referencedColumns list of Column instances on the referenced Table. Only col.getName() should be assumed to be correct
+ * @param uniqueReference true if there is no other references to the same table
+ * @return null if use defaults or non-empty String with a specific name
+ */
+ public String foreignKeyToInverseEntityName(String keyname, TableIdentifier fromTable, List fromColumnNames, TableIdentifier referencedTable, List referencedColumnNames, boolean uniqueReference);
+
/**
* @param table
* @return true if this table is considered to be a many-to-many table.
@@ -184,7 +194,7 @@
public boolean isOneToOne(ForeignKey foreignKey);
-
-
-
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey);
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey);
+
}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2009-02-20 16:11:57 UTC (rev 16011)
@@ -60,11 +60,6 @@
<!ATTLIST column type CDATA #IMPLIED >
<!ATTLIST column property CDATA #IMPLIED >
<!ATTLIST column exclude (true|false) "false" >
-<!-- too much flexibility to maintain; just use a foreign-key definition
-<!ATTLIST column foreign-catalog CDATA #IMPLIED >
-<!ATTLIST column foreign-schema CDATA #IMPLIED >
-<!ATTLIST column foreign-table CDATA #IMPLIED >
-<!ATTLIST column foreign-column CDATA #IMPLIED > -->
<!ELEMENT key-column EMPTY >
<!ATTLIST key-column name CDATA #REQUIRED >
@@ -97,20 +92,31 @@
<!ELEMENT many-to-one EMPTY >
<!ATTLIST many-to-one property CDATA #IMPLIED>
<!ATTLIST many-to-one exclude (true|false) #IMPLIED>
+<!ATTLIST many-to-one cascade CDATA #IMPLIED>
+<!ATTLIST many-to-one fetch (join|select) #IMPLIED>
+<!ATTLIST many-to-one update (true|false) "true">
+<!ATTLIST many-to-one insert (true|false) "true">
<!-- pure one to one (shared pk) are managed) -->
<!ELEMENT one-to-one EMPTY >
<!ATTLIST one-to-one property CDATA #IMPLIED>
<!ATTLIST one-to-one exclude (true|false) #IMPLIED>
+<!ATTLIST one-to-one cascade CDATA #IMPLIED>
+<!ATTLIST one-to-one fetch (join|select) #IMPLIED>
+
<!ELEMENT inverse-one-to-one EMPTY >
<!ATTLIST inverse-one-to-one property CDATA #IMPLIED>
<!ATTLIST inverse-one-to-one exclude (true|false) #IMPLIED>
+<!ATTLIST inverse-one-to-one cascade CDATA #IMPLIED>
+<!ATTLIST inverse-one-to-one fetch (join|select) #IMPLIED>
<!ELEMENT set EMPTY >
<!ATTLIST set property CDATA #IMPLIED>
<!ATTLIST set exclude (true|false) #IMPLIED>
+<!ATTLIST set cascade CDATA #IMPLIED>
+
<!-- <!ELEMENT bag EMPTY >
<!ATTLIST bag property CDATA #REQUIRED> -->
Modified: branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2009-02-20 16:11:57 UTC (rev 16011)
@@ -1,6 +1,9 @@
<set
name="${property.name}"
inverse="${property.value.inverse?string}"
+<#if property.cascade != "none">
+ cascade="${property.cascade}"
+</#if>
<#if !c2h.isOneToMany(property)>
table="${property.value.collectionTable.name}"
</#if>
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml 2009-02-20 16:11:57 UTC (rev 16011)
@@ -36,7 +36,7 @@
<property name="numberAvailable" type="int" column="`number-Available`"/>
- <set name="aSet">
+ <set name="aSet" cascade="delete, update">
<meta attribute="set-desc">anotherone</meta>
<key/>
<one-to-many class="Basic"/>
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -155,7 +155,38 @@
}
+
+ public void testCollectionAttributes() throws DocumentException {
+ File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml");
+ assertFileAndExists(outputXml);
+
+ SAXReader xmlReader = this.getSAXReader();
+
+ Document document = xmlReader.read(outputXml);
+ XPath xpath = DocumentHelper.createXPath("//hibernate-mapping/class/set");
+ List list = xpath.selectNodes(document);
+ assertEquals("Expected to get one set element", 1, list.size());
+ Element node = (Element) list.get(0);
+ assertEquals("delete, update", node.attributeValue("cascade"));
+
+
+
+// xpath = DocumentHelper.createXPath("//hibernate-mapping/class/property/meta");
+// list = xpath.selectNodes(document);
+// assertEquals("Expected to get one meta element", 1, list.size());
+// node = (Node) list.get(0);
+// assertEquals(node.getText(),"description");
+//
+// xpath = DocumentHelper.createXPath("//hibernate-mapping/class/set/meta");
+// list = xpath.selectNodes(document);
+// assertEquals("Expected to get one meta element", 1, list.size());
+// node = (Node) list.get(0);
+// assertEquals(node.getText(),"anotherone");
+
+
+ }
+
public void testComments() throws DocumentException {
File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/ClassFullAttribute.hbm.xml");
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -29,7 +29,7 @@
*/
public class RevEngForeignKeyTests extends JDBCMetaDataBinderTestCase {
- private static final String OVERRIDETEST_FOREIGNKEY_XML = "org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml";
+ private static final String FOREIGN_KEY_TEST_XML = "org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml";
private static final String BAD_FOREIGNKEY_XML = "org/hibernate/tool/test/jdbc2cfg/badforeignkeytest.reveng.xml";;
public static Test suite() {
@@ -69,7 +69,7 @@
OverrideRepository or = buildOverrideRepository();
- or.addResource(OVERRIDETEST_FOREIGNKEY_XML);
+ or.addResource(FOREIGN_KEY_TEST_XML);
ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy());
JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration();
@@ -91,8 +91,11 @@
assertNotNull(employee.getProperty("worksOns"));
assertNotNull("property should be renamed by reveng.xml", employee.getProperty("manager"));
assertPropertyNotExists( employee, "employees", "set should be excluded by reveng.xml" );
- assertNotNull("should be renamed by reveng.xml", employee.getProperty("managedProjects"));
+ Property setProperty = employee.getProperty("managedProjects");
+ assertNotNull("should be renamed by reveng.xml", setProperty);
+ assertEquals("delete, update", setProperty.getCascade());
+
assertEquals(4, employee.getPropertyClosureSpan());
assertEquals("id", employee.getIdentifierProperty().getName());
@@ -119,7 +122,7 @@
OverrideRepository or = buildOverrideRepository();
- or.addResource(OVERRIDETEST_FOREIGNKEY_XML);
+ or.addResource(FOREIGN_KEY_TEST_XML);
ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy());
JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration();
@@ -134,10 +137,19 @@
assertPropertyNotExists(addressPerson, "person", "should be removed by reveng.xml");
assertPropertyNotExists(person, "addressPerson", "should be removed by reveng.xml");
- Property property = addressMultiPerson.getProperty("multiPerson");
+ Property property = addressMultiPerson.getProperty("renamedOne");
assertNotNull(property);
- assertPropertyNotExists(multiPerson, "addressMultiPerson", "should be removed by reveng.xml");
+ assertEquals("Casade should be set to delete by reveng.xml", "delete", property.getCascade());
+
+
+ assertPropertyNotExists(multiPerson, "addressMultiPerson", "should not be there");
+ Property o2o = multiPerson.getProperty("renamedInversedOne");
+ assertNotNull(o2o);
+
+ assertEquals("update", o2o.getCascade());
+ assertEquals("JOIN", o2o.getValue().getFetchMode().toString());
+
}
public void testDuplicateForeignKeyDefinition() {
@@ -159,6 +171,43 @@
}
+ public void testManyToOneAttributeDefaults() {
+
+ PersistentClass classMapping = cfg.getClassMapping("Employee");
+ Property property = classMapping.getProperty("employee");
+
+ assertEquals("none", property.getCascade());
+ assertEquals(true, property.isUpdateable());
+ assertEquals(true, property.isInsertable());
+ assertEquals("SELECT", property.getValue().getFetchMode().toString());
+
+ }
+
+ public void testManyToOneAttributeOverrides() {
+
+ OverrideRepository or = buildOverrideRepository();
+
+ or.addResource(FOREIGN_KEY_TEST_XML);
+ ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy());
+
+ JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration();
+ localCfg.setReverseEngineeringStrategy(repository);
+ localCfg.readFromJDBC();
+
+ PersistentClass classMapping = localCfg.getClassMapping("Employee");
+ Property property = classMapping.getProperty("manager");
+
+ assertEquals("all", property.getCascade());
+ assertEquals(false, property.isUpdateable());
+ assertEquals(false, property.isInsertable());
+ assertEquals("JOIN", property.getValue().getFetchMode().toString());
+
+
+ }
+
+
+
+
private void assertPropertyNotExists(PersistentClass employee, String name, String msg) {
try {
employee.getProperty(name);
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2009-02-20 16:11:57 UTC (rev 16011)
@@ -7,7 +7,7 @@
<table name="EMPLOYEE">
<foreign-key constraint-name="EMPLOYEE_MANAGER">
- <many-to-one property="manager"/>
+ <many-to-one property="manager" cascade="all" update="false" insert="false" fetch="join"/>
<set exclude="true"/>
</foreign-key>
</table>
@@ -15,7 +15,7 @@
<table name="PROJECT">
<foreign-key constraint-name="PROJECT_MANAGER">
<many-to-one exclude="true"/>
- <set property="managedProjects"/>
+ <set property="managedProjects" cascade="delete, update"/>
</foreign-key>
</table>
@@ -28,8 +28,8 @@
<table name="ADDRESS_MULTI_PERSON">
<foreign-key constraint-name="ADDRESS_MULTI_PERSON">
- <one-to-one exclude="false"/>
- <inverse-one-to-one exclude="true"/>
+ <one-to-one property="renamedOne" exclude="false" cascade="delete"/>
+ <inverse-one-to-one property="renamedInversedOne" exclude="false" cascade="update" fetch="join"/>
</foreign-key>
</table>
Modified: branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -2,6 +2,7 @@
import java.util.Map;
import java.util.Properties;
+import org.hibernate.cfg.reveng.AssociationInfo;
import org.hibernate.cfg.reveng.ReverseEngineeringRuntimeInfo;
import org.hibernate.cfg.reveng.ReverseEngineeringSettings;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
@@ -167,4 +168,25 @@
// TODO Auto-generated method stub
return false;
}
+
+ @Override
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable, List referencedColumnNames,
+ boolean uniqueReference) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
16 years, 7 months
Hibernate SVN: r16010 - in validator/trunk/hibernate-validator/src: main/java/org/hibernate/validation/engine/groups and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2009-02-20 09:53:16 -0500 (Fri, 20 Feb 2009)
New Revision: 16010
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
Log:
HV-92 Added group inheritance and added some more tests.
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java 2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java 2009-02-20 14:53:16 UTC (rev 16010)
@@ -103,13 +103,48 @@
object, messageInterpolator, constraintValidatorFactory
);
+
+ groups = validateGroupVararg( groups );
+
+ List<ConstraintViolationImpl<T>> list = validateInContext( context, Arrays.asList( groups ) );
+ return new HashSet<ConstraintViolation<T>>( list );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups) {
+ List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
+ validateProperty( object, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
+ return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
+ List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
+ validateValue( beanType, value, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
+ return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public BeanDescriptor getConstraintsForClass(Class<?> clazz) {
+ return getBeanMetaData( clazz ).getBeanDescriptor();
+ }
+
+ private Class<?>[] validateGroupVararg(Class<?>[] groups) {
+ if ( groups == null ) {
+ throw new IllegalArgumentException( "null passed as group name" );
+ }
+
// if no groups is specified use the default
if ( groups.length == 0 ) {
groups = DEFAULT_GROUP_ARRAY;
}
-
- List<ConstraintViolationImpl<T>> list = validateInContext( context, Arrays.asList( groups ) );
- return new HashSet<ConstraintViolation<T>>( list );
+ return groups;
}
/**
@@ -129,15 +164,13 @@
GroupChain groupChain = groupChainGenerator.getGroupChainFor( groups );
while ( groupChain.hasNext() ) {
Group group = groupChain.next();
- Class<?> currentSequence = group.getSequence();
context.setCurrentGroup( group.getGroup() );
validateConstraints( context );
validateCascadedConstraints( context );
- if ( group.partOfSequence() && context.getFailingConstraints().size() > 0 ) {
- while ( groupChain.hasNext() && currentSequence == groupChain.next().getSequence() ) {
- }
+ if ( groupChain.inSequence() && context.getFailingConstraints().size() > 0 ) {
+ groupChain.moveToLastInCurrentSequence();
}
}
return context.getFailingConstraints();
@@ -247,15 +280,6 @@
}
}
- /**
- * {@inheritDoc}
- */
- public <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups) {
- List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
- validateProperty( object, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
- return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
- }
-
private <T> void validateProperty(T object, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
if ( object == null ) {
throw new IllegalArgumentException( "Validated object cannot be null" );
@@ -270,15 +294,11 @@
return;
}
- // if no groups is specified use the default
- if ( groups.length == 0 ) {
- groups = DEFAULT_GROUP_ARRAY;
- }
+ groups = validateGroupVararg( groups );
GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
while ( groupChain.hasNext() ) {
Group group = groupChain.next();
- Class<?> currentSequence = group.getSequence();
for ( MetaConstraint metaConstraint : metaConstraints ) {
if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
continue;
@@ -290,26 +310,12 @@
failingConstraintViolations.addAll( context.getFailingConstraints() );
}
- if ( group.partOfSequence() && failingConstraintViolations.size() > 0 ) {
- while ( groupChain.hasNext() && currentSequence == groupChain.next().getSequence() ) {
- }
+ if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+ groupChain.moveToLastInCurrentSequence();
}
}
}
- /**
- * {@inheritDoc}
- */
- public <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups) {
- List<ConstraintViolationImpl<T>> failingConstraintViolations = new ArrayList<ConstraintViolationImpl<T>>();
- validateValue( beanType, value, new PropertyIterator( propertyName ), failingConstraintViolations, groups );
- return new HashSet<ConstraintViolation<T>>( failingConstraintViolations );
- }
-
- public BeanDescriptor getConstraintsForClass(Class<?> clazz) {
- return getBeanMetaData( clazz ).getBeanDescriptor();
- }
-
private <T> void validateValue(Class<T> beanType, Object value, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
collectMetaConstraintsForPath( beanType, propertyIter, metaConstraints );
@@ -318,15 +324,11 @@
return;
}
- // if no groups is specified use the default
- if ( groups.length == 0 ) {
- groups = DEFAULT_GROUP_ARRAY;
- }
+ groups = validateGroupVararg( groups );
GroupChain groupChain = groupChainGenerator.getGroupChainFor( Arrays.asList( groups ) );
while ( groupChain.hasNext() ) {
Group group = groupChain.next();
- Class<?> currentSequence = group.getSequence();
for ( MetaConstraint metaConstraint : metaConstraints ) {
if ( !metaConstraint.getGroupList().contains( group.getGroup() ) ) {
@@ -341,8 +343,8 @@
failingConstraintViolations.addAll( context.getFailingConstraints() );
}
- if ( group.partOfSequence() && failingConstraintViolations.size() > 0 ) {
- break;
+ if ( groupChain.inSequence() && failingConstraintViolations.size() > 0 ) {
+ groupChain.moveToLastInCurrentSequence();
}
}
}
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java 2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java 2009-02-20 14:53:16 UTC (rev 16010)
@@ -27,10 +27,20 @@
*/
public class GroupChain {
+ /**
+ * The actual list of groups maintained by this instance.
+ */
private List<Group> groupList = new ArrayList<Group>();
+ /**
+ * A pointer to the next group element.
+ */
private int nextGroupPointer = 0;
+ /**
+ * The current group.
+ */
+ private Class<?> currentSequence = null;
/**
* @return Returns <code>true</code> if there is another group in the chain <code>false</code> otherwise.
@@ -43,12 +53,14 @@
* @return Returns the next group in the chain or <code>null</code> if there is none.
*/
public Group next() {
- if ( hasNext() ) {
- return groupList.get( nextGroupPointer++ );
- }
- else {
+ if ( !hasNext() ) {
return null;
}
+
+ Group group = groupList.get( nextGroupPointer );
+ nextGroupPointer++;
+ currentSequence = group.getSequence();
+ return group;
}
/**
@@ -61,7 +73,7 @@
public boolean containsSequence(Class<?> groupSequence) {
boolean result = false;
for ( Group group : groupList ) {
- if ( groupSequence.getName().equals( group.getSequence() ) ) {
+ if ( groupSequence.getName().equals( group.getSequence().getName() ) ) {
result = true;
break;
}
@@ -69,6 +81,25 @@
return result;
}
+ public void moveToLastInCurrentSequence() {
+ if ( currentSequence == null ) {
+ return;
+ }
+
+ while ( hasNext() ) {
+ if ( currentSequence.getName().equals( groupList.get( nextGroupPointer ).getSequence().getName() ) ) {
+ next();
+ }
+ else {
+ break;
+ }
+ }
+ }
+
+ public boolean inSequence() {
+ return currentSequence != null;
+ }
+
void insertGroup(Group group) {
if ( nextGroupPointer != 0 ) {
throw new RuntimeException( "Trying to modify the GroupChain while iterating." );
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java 2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java 2009-02-20 14:53:16 UTC (rev 16010)
@@ -47,9 +47,10 @@
GroupChain chain = new GroupChain();
for ( Class<?> clazz : groups ) {
- if ( clazz.getAnnotation( GroupSequence.class ) == null ) { // normal clazz
+ if ( clazz.getAnnotation( GroupSequence.class ) == null ) {
Group group = new Group( clazz );
chain.insertGroup( group );
+ insertInheritedGroups( clazz, chain );
}
else {
insertSequence( clazz, chain );
@@ -59,6 +60,14 @@
return chain;
}
+ private void insertInheritedGroups(Class<?> clazz, GroupChain chain) {
+ for ( Class<?> extendedInterface : clazz.getInterfaces() ) {
+ Group group = new Group( extendedInterface );
+ chain.insertGroup( group );
+ insertInheritedGroups(extendedInterface, chain);
+ }
+ }
+
private void insertSequence(Class<?> clazz, GroupChain chain) {
List<Group> sequence;
if ( resolvedSequences.containsKey( clazz ) ) {
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java 2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/ValidatorImplTest.java 2009-02-20 14:53:16 UTC (rev 16010)
@@ -26,6 +26,7 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
+import org.slf4j.Logger;
import org.hibernate.validation.eg.Actor;
import org.hibernate.validation.eg.Address;
@@ -34,6 +35,7 @@
import org.hibernate.validation.eg.Engine;
import org.hibernate.validation.eg.Order;
import org.hibernate.validation.eg.UnconstraintEntity;
+import org.hibernate.validation.util.LoggerFactory;
import org.hibernate.validation.util.TestUtil;
/**
@@ -43,7 +45,8 @@
*/
public class ValidatorImplTest {
- // @SpecAssertion( section = "3.1" )
+ private static final Logger log = LoggerFactory.make();
+
@Test
public void testWrongMethodName() {
try {
@@ -68,14 +71,22 @@
@Test
public void testUnconstraintClass() {
Validator validator = TestUtil.getValidator();
- assertTrue( "There should be no constraints", !validator.getConstraintsForClass( UnconstraintEntity.class ).hasConstraints() );
+ assertTrue(
+ "There should be no constraints",
+ !validator.getConstraintsForClass( UnconstraintEntity.class ).hasConstraints()
+ );
}
@Test
public void testHasConstraintsAndIsBeanConstrained() {
Validator validator = TestUtil.getValidator();
- assertTrue( "There should not be constraints", !validator.getConstraintsForClass( Customer.class ).hasConstraints() );
- assertTrue( "It should be constrainted", validator.getConstraintsForClass( Customer.class ).isBeanConstrained() );
+ assertTrue(
+ "There should not be constraints", !validator.getConstraintsForClass( Customer.class ).hasConstraints()
+ );
+ assertTrue(
+ "It should be constrainted", validator.getConstraintsForClass( Customer.class ).isBeanConstrained()
+ );
+ // TODO fix test
// assertTrue( "It should be constrainted even if it has no constraint annotations - not implemented yet", validator.getConstraintsForClass( Account.class ).isBeanConstrained() );
}
@@ -85,10 +96,61 @@
validator.validate( null );
}
- @Test(expected = IllegalArgumentException.class)
+ @Test
+ public void testPassingNullAsGroup() {
+ Validator validator = TestUtil.getValidator();
+ Customer customer = new Customer();
+ try {
+ validator.validate( customer, null );
+ fail();
+ }
+ catch ( IllegalArgumentException e ) {
+ log.trace( "success" );
+ }
+
+ try {
+ validator.validateProperty( customer, "firstName", null );
+ fail();
+ }
+ catch ( IllegalArgumentException e ) {
+ log.trace( "success" );
+ }
+
+ try {
+ validator.validateValue( Customer.class, "firstName", "foobar", null );
+ fail();
+ }
+ catch ( IllegalArgumentException e ) {
+ log.trace( "success" );
+ }
+ }
+
+ @Test
public void testValidateWithNullProperty() {
Validator validator = TestUtil.getValidator();
- validator.validateProperty( null, "firstName" );
+ try {
+ validator.validate( null );
+ fail();
+ }
+ catch ( IllegalArgumentException e ) {
+ log.trace( "success" );
+ }
+
+ try {
+ validator.validateProperty( null, "firstName" );
+ fail();
+ }
+ catch ( IllegalArgumentException e ) {
+ log.trace( "success" );
+ }
+
+ try {
+ validator.validateValue( null, "firstName", "foobar" );
+ fail();
+ }
+ catch ( IllegalArgumentException e ) {
+ log.trace( "success" );
+ }
}
@Test
@@ -211,7 +273,9 @@
assertEquals( "Wrong message", "may not be empty", constraintViolation.getMessage() );
assertEquals( "Wrong root entity", clint, constraintViolation.getRootBean() );
assertEquals( "Wrong value", morgan.getLastName(), constraintViolation.getInvalidValue() );
- assertEquals( "Wrong propertyName", "playedWith[0].playedWith[1].lastName", constraintViolation.getPropertyPath() );
+ assertEquals(
+ "Wrong propertyName", "playedWith[0].playedWith[1].lastName", constraintViolation.getPropertyPath()
+ );
}
@Test
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java 2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java 2009-02-20 14:53:16 UTC (rev 16010)
@@ -1,9 +1,11 @@
package org.hibernate.validation.engine.groups;
+import javax.validation.groups.Default;
+
/**
* Customer can buy without being harrassed by the checking-out process.
*
* @author Emmanuel Bernard
*/
-public interface BuyInOneClick {
+public interface BuyInOneClick extends Default, Billable {
}
\ No newline at end of file
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-20 13:42:03 UTC (rev 16009)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-20 14:53:16 UTC (rev 16010)
@@ -192,27 +192,64 @@
Validator validator = TestUtil.getValidator();
Set<ConstraintViolation<User>> constraintViolations = validator.validate( user );
- assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
+ assertEquals(
+ "There should be two violations against the implicit default group",
+ 2,
+ constraintViolations.size()
+ );
constraintViolations = validator.validate( user, Default.class );
- assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
+ assertEquals(
+ "There should be two violations against the explicit defualt group",
+ 2,
+ constraintViolations.size()
+ );
constraintViolations = validator.validate( user, Billable.class );
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ assertEquals(
+ "There should be one violation against Billable",
+ 1,
+ constraintViolations.size() );
+ constraintViolations = validator.validate( user, Default.class, Billable.class );
+ assertEquals(
+ "There should be 3 violation against Default and Billable",
+ 3,
+ constraintViolations.size() );
+
constraintViolations = validator.validate( user, BuyInOneClick.class );
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ assertEquals(
+ "Three violations expected since BuyInOneClick extends Default and Billable",
+ 3,
+ constraintViolations.size()
+ );
constraintViolations = validator.validate( user, BuyInOneClick.class, Billable.class );
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ assertEquals(
+ "BuyInOneClick already contains all other groups. Adding Billable does not change the number of violations",
+ 3,
+ constraintViolations.size()
+ );
constraintViolations = validator.validate( user, BuyInOneClick.class, Default.class );
- assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
+ assertEquals(
+ "BuyInOneClick already contains all other groups. Adding Default does not change the number of violations",
+ 3,
+ constraintViolations.size()
+ );
constraintViolations = validator.validate( user, BuyInOneClick.class, Default.class, Billable.class );
- assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
+ assertEquals(
+ "BuyInOneClick already contains all other groups. Adding Billable and Default does not change the number of violations",
+ 3,
+ constraintViolations.size()
+ );
- constraintViolations = validator.validate( user, BuyInOneClick.class, BuyInOneClick.class );
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ constraintViolations = validator.validate( user, Billable.class, Billable.class );
+ assertEquals(
+ "Adding the same group twice is still only leads to a single violation",
+ 1,
+ constraintViolations.size()
+ );
}
}
\ No newline at end of file
16 years, 7 months
Hibernate SVN: r16009 - validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report.
by hibernate-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2009-02-20 08:42:03 -0500 (Fri, 20 Feb 2009)
New Revision: 16009
Modified:
validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
Log:
Remerge in my changes
Modified: validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
===================================================================
--- validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-20 13:35:41 UTC (rev 16008)
+++ validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-20 13:42:03 UTC (rev 16009)
@@ -341,7 +341,7 @@
}
}
- double coveragePercent = testable > 0 ? ((coverage * 1.0) / testable) * 100 : 100;
+ double coveragePercent = assertions > 0 ? ((coverage * 1.0) / assertions) * 100 : -1;
sb.append("<td align=\"center\">");
sb.append(assertions);
@@ -355,13 +355,19 @@
sb.append(coverage);
sb.append("</td>");
- String bgColor = coveragePercent < failThreshold ? "#ffaaaa" :
- coveragePercent < passThreshold ? "#ffffaa" : "#aaffaa";
+ if (coveragePercent >= 0)
+ {
+ String bgColor = coveragePercent < 60 ? "#ffaaaa" : coveragePercent < 80 ? "#ffffaa" : "#aaffaa" ;
+
+ sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "\">");
+ sb.append(String.format("%.2f%%", coveragePercent));
+ sb.append("</td>");
+ }
+ else
+ {
+ sb.append("<td />");
+ }
- sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "\">");
- sb.append(String.format("%.2f%%", coveragePercent));
- sb.append("</td>");
-
sb.append("</tr>");
}
16 years, 7 months
Hibernate SVN: r16008 - validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report.
by hibernate-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2009-02-20 08:35:41 -0500 (Fri, 20 Feb 2009)
New Revision: 16008
Modified:
validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
Log:
minor style changes
Modified: validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
===================================================================
--- validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-20 12:39:56 UTC (rev 16007)
+++ validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-20 13:35:41 UTC (rev 16008)
@@ -227,20 +227,19 @@
}
}
+ double untestablePercent = assertionTotal > 0 ? (((assertionTotal - testableAssertionTotal) * 1.0) / assertionTotal) * 100 : 100;
+
sb.append(assertionTotal);
sb.append("</td>");
sb.append("</tr>");
sb.append("<tr>");
- sb.append("<td>Total number of testable assertions</td>");
+ sb.append("<td>Total number of untestable assertions</td>");
sb.append("<td>");
- sb.append(testableAssertionTotal);
+ sb.append(assertionTotal - testableAssertionTotal).append(" (").append(String.format("%.2f%%", untestablePercent)).append(")");
sb.append("</td>");
sb.append("</tr>");
- sb.append("<tr>");
- sb.append("<td>Total number of tested assertions</td>");
-
int coverage = 0;
for (String sectionId : auditParser.getSectionIds())
@@ -253,12 +252,6 @@
}
}
}
-
- sb.append("<td>");
- sb.append(coverage);
- sb.append("</td>");
-
- sb.append("</tr>");
double coveragePercent = testableAssertionTotal > 0 ? ((coverage * 1.0) / testableAssertionTotal) * 100 : 100;
String bgColor = coveragePercent < failThreshold ? "#ffaaaa" :
@@ -266,11 +259,13 @@
sb.append("<tr style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">");
- sb.append("<td style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">Total percentage of tested assertions</td>");
+ sb.append("<td style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">Total number of tested assertions</td>");
sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">");
+ sb.append(coverage).append(" (");
+
sb.append(String.format("%.2f%%", coveragePercent));
- sb.append("</td>");
+ sb.append(")</td>");
sb.append("</tr>");
16 years, 7 months
Hibernate SVN: r16007 - validator/trunk/tck-utils/api/src/main/resources.
by hibernate-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2009-02-20 07:39:56 -0500 (Fri, 20 Feb 2009)
New Revision: 16007
Modified:
validator/trunk/tck-utils/api/src/main/resources/tck-audit.xsd
Log:
Fix xsd for updates
Modified: validator/trunk/tck-utils/api/src/main/resources/tck-audit.xsd
===================================================================
--- validator/trunk/tck-utils/api/src/main/resources/tck-audit.xsd 2009-02-20 09:12:05 UTC (rev 16006)
+++ validator/trunk/tck-utils/api/src/main/resources/tck-audit.xsd 2009-02-20 12:39:56 UTC (rev 16007)
@@ -2,7 +2,10 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://jboss.com/products/webbeans/tck/audit"
- xmlns:audit="http://jboss.com/products/webbeans/tck/audit">
+ xmlns:audit="http://jboss.com/products/webbeans/tck/audit"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd"
+ >
<xs:element name="specification">
<xs:annotation>
@@ -18,6 +21,9 @@
</xs:element>
<xs:element name="section">
+ <xs:annotation>
+ <xs:documentation>Each section of the specification should be identified and entered</xs:documentation>
+ </xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="audit:assertion"/>
@@ -27,22 +33,48 @@
</xs:element>
<xs:attributeGroup name="attlist.section">
- <xs:attribute name="id" type="xs:string"/>
- <xs:attribute name="title" type="xs:string"/>
+ <xs:attribute name="id" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>The section number</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="title" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>The section title</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:attributeGroup>
<xs:element name="assertion">
<xs:complexType>
<xs:sequence>
- <xs:element minOccurs="1" maxOccurs="1" ref="audit:text"/>
- <xs:element minOccurs="0" maxOccurs="1" ref="audit:note"/>
+ <xs:element minOccurs="1" maxOccurs="1" ref="audit:text">
+ <xs:annotation>
+ <xs:documentation>The specification text that this assertion represents. You can include highlighting such as _highlight_ or ~score out~.</xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element minOccurs="0" maxOccurs="1" ref="audit:note">
+ <xs:annotation>
+ <xs:documentation>A note on the assertion, for example a justifaction for marking this assertion untestable</xs:documentation>
+ </xs:annotation>
+ </xs:element>
</xs:sequence>
<xs:attributeGroup ref="audit:attlist.assertion"/>
</xs:complexType>
</xs:element>
<xs:attributeGroup name="attlist.assertion">
- <xs:attribute name="id" type="xs:string"/>
+ <xs:attribute name="id" type="xs:string"/>
+ <xs:attribute name="testable" type="xs:boolean" default="true">
+ <xs:annotation>
+ <xs:documentation>By default true, set to false if this test is untestable. The coverage report will then not count it as untested.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="implied" type="xs:boolean" default="true">
+ <xs:annotation>
+ <xs:documentation>Some assertions are often implied by the specification (for example inversions of statments), mark an assertion as implied using this attribute.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:attributeGroup>
<xs:element name="text">
16 years, 7 months
Hibernate SVN: r16006 - in validator/trunk/hibernate-validator/src: main/java/org/hibernate/validation/engine/groups and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2009-02-20 04:12:05 -0500 (Fri, 20 Feb 2009)
New Revision: 16006
Added:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Billable.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CreditCard.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupChainGeneratorTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java
Removed:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/group/
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupChainGeneratorTest.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
Modified:
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Address.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence1.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence2.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/ZipCode.java
validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/ZipCodeCoherenceChecker.java
Log:
Some directory refactoring
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java 2009-02-20 02:28:00 UTC (rev 16005)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/ValidatorImpl.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -35,9 +35,9 @@
import javax.validation.Validator;
import javax.validation.groups.Default;
-import org.hibernate.validation.engine.group.Group;
-import org.hibernate.validation.engine.group.GroupChain;
-import org.hibernate.validation.engine.group.GroupChainGenerator;
+import org.hibernate.validation.engine.groups.Group;
+import org.hibernate.validation.engine.groups.GroupChain;
+import org.hibernate.validation.engine.groups.GroupChainGenerator;
import org.hibernate.validation.util.PropertyIterator;
import org.hibernate.validation.util.ReflectionHelper;
@@ -103,7 +103,7 @@
object, messageInterpolator, constraintValidatorFactory
);
- // if no group is specified use the default
+ // if no groups is specified use the default
if ( groups.length == 0 ) {
groups = DEFAULT_GROUP_ARRAY;
}
@@ -264,13 +264,13 @@
final Class<T> beanType = ( Class<T> ) object.getClass();
Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
- getMetaConstraintsForPath( beanType, propertyIter, metaConstraints );
+ collectMetaConstraintsForPath( beanType, propertyIter, metaConstraints );
if ( metaConstraints.size() == 0 ) {
return;
}
- // if no group is specified use the default
+ // if no groups is specified use the default
if ( groups.length == 0 ) {
groups = DEFAULT_GROUP_ARRAY;
}
@@ -312,13 +312,13 @@
private <T> void validateValue(Class<T> beanType, Object value, PropertyIterator propertyIter, List<ConstraintViolationImpl<T>> failingConstraintViolations, Class<?>... groups) {
Set<MetaConstraint> metaConstraints = new HashSet<MetaConstraint>();
- getMetaConstraintsForPath( beanType, propertyIter, metaConstraints );
+ collectMetaConstraintsForPath( beanType, propertyIter, metaConstraints );
if ( metaConstraints.size() == 0 ) {
return;
}
- // if no group is specified use the default
+ // if no groups is specified use the default
if ( groups.length == 0 ) {
groups = DEFAULT_GROUP_ARRAY;
}
@@ -361,7 +361,7 @@
* @param propertyIter an instance of <code>PropertyIterator</code>
* @param metaConstraints Set of <code>MetaConstraint</code>s to collect all matching constraints.
*/
- private void getMetaConstraintsForPath(Class<?> clazz, PropertyIterator propertyIter, Set<MetaConstraint> metaConstraints) {
+ private void collectMetaConstraintsForPath(Class<?> clazz, PropertyIterator propertyIter, Set<MetaConstraint> metaConstraints) {
propertyIter.split();
if ( !propertyIter.hasNext() ) {
@@ -384,7 +384,7 @@
continue;
}
}
- getMetaConstraintsForPath( ( Class<?> ) type, propertyIter, metaConstraints );
+ collectMetaConstraintsForPath( ( Class<?> ) type, propertyIter, metaConstraints );
}
}
}
Copied: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups (from rev 15999, validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/group)
Modified: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/group/Group.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/Group.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,4 +1,4 @@
-// $Id:$
+// $Id$
/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
@@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.hibernate.validation.engine.group;
+package org.hibernate.validation.engine.groups;
/**
* Encapsulates a single group.
@@ -78,7 +78,7 @@
@Override
public String toString() {
return "Group{" +
- "group=" + group +
+ "groups=" + group +
", sequence=" + sequence +
'}';
}
Deleted: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/group/GroupChain.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,99 +0,0 @@
-// $Id:$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, and individual contributors
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.hibernate.validation.engine.group;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An instance of <code>GroupExecutionChain</code> defines the order in to validate groups during the validation process.
- *
- * @author Hardy Ferentschik
- */
-public class GroupChain {
-
- private List<Group> groupList = new ArrayList<Group>();
-
- private int nextGroupPointer = 0;
-
-
- /**
- * @return Returns <code>true</code> if there is another group in the chain <code>false</code> otherwise.
- */
- public boolean hasNext() {
- return nextGroupPointer <= groupList.size();
- }
-
- /**
- * @return Returns the next group in the chain or <code>null</code> if there is none.
- */
- public Group next() {
- if ( hasNext() ) {
- return groupList.get( nextGroupPointer++ );
- }
- else {
- return null;
- }
- }
-
- /**
- * @return The number of groups in this chain.
- */
- public int size() {
- return groupList.size();
- }
-
- public boolean containsSequence(Class<?> groupSequence) {
- boolean result = false;
- for ( Group group : groupList ) {
- if ( groupSequence.getName().equals( group.getSequence() ) ) {
- result = true;
- break;
- }
- }
- return result;
- }
-
- void insertGroup(Group group) {
- if ( nextGroupPointer != 0 ) {
- throw new RuntimeException( "Trying to modify the GroupChain while iterating." );
- }
-
- if ( !groupList.contains( group ) ) {
- groupList.add( group );
- }
- }
-
- void insertSequence(List<Group> groups) {
- if ( groups == null || groups.size() == 0 ) {
- return;
- }
-
- if ( !containsSequence( groups.get( 0 ).getSequence() ) ) {
- groupList.addAll( groups );
- }
- }
-
- @Override
- public String toString() {
- return "GroupChain{" +
- "groupList=" + groupList +
- ", nextGroupPointer=" + nextGroupPointer +
- '}';
- }
-}
\ No newline at end of file
Copied: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java (from rev 16002, validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/group/GroupChain.java)
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChain.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,99 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.engine.groups;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An instance of <code>GroupExecutionChain</code> defines the order in to validate groups during the validation process.
+ *
+ * @author Hardy Ferentschik
+ */
+public class GroupChain {
+
+ private List<Group> groupList = new ArrayList<Group>();
+
+ private int nextGroupPointer = 0;
+
+
+ /**
+ * @return Returns <code>true</code> if there is another group in the chain <code>false</code> otherwise.
+ */
+ public boolean hasNext() {
+ return nextGroupPointer < groupList.size();
+ }
+
+ /**
+ * @return Returns the next group in the chain or <code>null</code> if there is none.
+ */
+ public Group next() {
+ if ( hasNext() ) {
+ return groupList.get( nextGroupPointer++ );
+ }
+ else {
+ return null;
+ }
+ }
+
+ /**
+ * @return The number of groups in this chain.
+ */
+ public int size() {
+ return groupList.size();
+ }
+
+ public boolean containsSequence(Class<?> groupSequence) {
+ boolean result = false;
+ for ( Group group : groupList ) {
+ if ( groupSequence.getName().equals( group.getSequence() ) ) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ void insertGroup(Group group) {
+ if ( nextGroupPointer != 0 ) {
+ throw new RuntimeException( "Trying to modify the GroupChain while iterating." );
+ }
+
+ if ( !groupList.contains( group ) ) {
+ groupList.add( group );
+ }
+ }
+
+ void insertSequence(List<Group> groups) {
+ if ( groups == null || groups.size() == 0 ) {
+ return;
+ }
+
+ if ( !containsSequence( groups.get( 0 ).getSequence() ) ) {
+ groupList.addAll( groups );
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "GroupChain{" +
+ "groupList=" + groupList +
+ ", nextGroupPointer=" + nextGroupPointer +
+ '}';
+ }
+}
\ No newline at end of file
Deleted: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/group/GroupChainGenerator.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,95 +0,0 @@
-// $Id:$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, and individual contributors
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.hibernate.validation.engine.group;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.validation.GroupSequence;
-import javax.validation.ValidationException;
-
-/**
- * Used to determine the execution order.
- *
- * @author Hardy Ferentschik
- */
-public class GroupChainGenerator {
-
- private final Map<Class<?>, List<Group>> resolvedSequences = new HashMap<Class<?>, List<Group>>();
-
- public GroupChain getGroupChainFor(Set<Class<?>> groups) {
- if ( groups == null || groups.size() == 0 ) {
- throw new IllegalArgumentException( "At least one group has to be specified." );
- }
-
- for ( Class<?> clazz : groups ) {
- if ( !clazz.isInterface() ) {
- throw new ValidationException( "A group has to be an interface. " + clazz.getName() + " is not." );
- }
- }
-
- GroupChain chain = new GroupChain();
- for ( Class<?> clazz : groups ) {
- if ( clazz.getAnnotation( GroupSequence.class ) == null ) { // normal clazz
- Group group = new Group( clazz );
- chain.insertGroup( group );
- }
- else {
- insertSequence( clazz, chain );
- }
- }
-
- return chain;
- }
-
- private void insertSequence(Class<?> clazz, GroupChain chain) {
- List<Group> sequence;
- if ( resolvedSequences.containsKey( clazz ) ) {
- sequence = resolvedSequences.get( clazz );
- }
- else {
- sequence = resolveSequence( clazz, new ArrayList<Class<?>>() );
- }
- chain.insertSequence( sequence );
- }
-
- private List<Group> resolveSequence(Class<?> group, List<Class<?>> processedSequences) {
- if ( processedSequences.contains( group ) ) {
- throw new ValidationException( "Cyclic dependecy in group definition" );
- }
- else {
- processedSequences.add( group );
- }
- List<Group> resolvedGroupSequence = new ArrayList<Group>();
- GroupSequence sequenceAnnotation = group.getAnnotation( GroupSequence.class );
- Class<?>[] sequenceArray = sequenceAnnotation.value();
- for ( Class clazz : sequenceArray ) {
- if ( clazz.getAnnotation( GroupSequence.class ) == null ) {
- resolvedGroupSequence.add( new Group( clazz, group ) );
- }
- else {
- List<Group> tmpSequence = resolveSequence( clazz, processedSequences );
- resolvedGroupSequence.addAll( tmpSequence );
- }
- }
- resolvedSequences.put( group, resolvedGroupSequence );
- return resolvedGroupSequence;
- }
-}
Copied: validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java (from rev 16002, validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/group/GroupChainGenerator.java)
===================================================================
--- validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java (rev 0)
+++ validator/trunk/hibernate-validator/src/main/java/org/hibernate/validation/engine/groups/GroupChainGenerator.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,95 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.engine.groups;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.validation.GroupSequence;
+import javax.validation.ValidationException;
+
+/**
+ * Used to determine the execution order.
+ *
+ * @author Hardy Ferentschik
+ */
+public class GroupChainGenerator {
+
+ private final Map<Class<?>, List<Group>> resolvedSequences = new HashMap<Class<?>, List<Group>>();
+
+ public GroupChain getGroupChainFor(Collection<Class<?>> groups) {
+ if ( groups == null || groups.size() == 0 ) {
+ throw new IllegalArgumentException( "At least one groups has to be specified." );
+ }
+
+ for ( Class<?> clazz : groups ) {
+ if ( !clazz.isInterface() ) {
+ throw new ValidationException( "A groups has to be an interface. " + clazz.getName() + " is not." );
+ }
+ }
+
+ GroupChain chain = new GroupChain();
+ for ( Class<?> clazz : groups ) {
+ if ( clazz.getAnnotation( GroupSequence.class ) == null ) { // normal clazz
+ Group group = new Group( clazz );
+ chain.insertGroup( group );
+ }
+ else {
+ insertSequence( clazz, chain );
+ }
+ }
+
+ return chain;
+ }
+
+ private void insertSequence(Class<?> clazz, GroupChain chain) {
+ List<Group> sequence;
+ if ( resolvedSequences.containsKey( clazz ) ) {
+ sequence = resolvedSequences.get( clazz );
+ }
+ else {
+ sequence = resolveSequence( clazz, new ArrayList<Class<?>>() );
+ }
+ chain.insertSequence( sequence );
+ }
+
+ private List<Group> resolveSequence(Class<?> group, List<Class<?>> processedSequences) {
+ if ( processedSequences.contains( group ) ) {
+ throw new ValidationException( "Cyclic dependecy in groups definition" );
+ }
+ else {
+ processedSequences.add( group );
+ }
+ List<Group> resolvedGroupSequence = new ArrayList<Group>();
+ GroupSequence sequenceAnnotation = group.getAnnotation( GroupSequence.class );
+ Class<?>[] sequenceArray = sequenceAnnotation.value();
+ for ( Class clazz : sequenceArray ) {
+ if ( clazz.getAnnotation( GroupSequence.class ) == null ) {
+ resolvedGroupSequence.add( new Group( clazz, group ) );
+ }
+ else {
+ List<Group> tmpSequence = resolveSequence( clazz, processedSequences );
+ resolvedGroupSequence.addAll( tmpSequence );
+ }
+ }
+ resolvedSequences.put( group, resolvedGroupSequence );
+ return resolvedGroupSequence;
+ }
+}
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups (from rev 15999, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group)
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Address.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/Address.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Address.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,4 +1,4 @@
-package org.hibernate.validation.engine.group;
+package org.hibernate.validation.engine.groups;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Billable.java (from rev 16002, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/Billable.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Billable.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/Billable.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,9 @@
+package org.hibernate.validation.engine.groups;
+
+/**
+ * Validation group checking whether user is billable.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface Billable {
+}
\ No newline at end of file
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java (from rev 16002, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/BuyInOneClick.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/BuyInOneClick.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,9 @@
+package org.hibernate.validation.engine.groups;
+
+/**
+ * Customer can buy without being harrassed by the checking-out process.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface BuyInOneClick {
+}
\ No newline at end of file
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CreditCard.java (from rev 16002, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/CreditCard.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CreditCard.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CreditCard.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,34 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.engine.groups;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class CreditCard {
+
+ private String number;
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+}
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/CyclicGroupSequence.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.hibernate.validation.engine.group;
+package org.hibernate.validation.engine.groups;
import javax.validation.GroupSequence;
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence1.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/CyclicGroupSequence1.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence1.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.hibernate.validation.engine.group;
+package org.hibernate.validation.engine.groups;
import javax.validation.GroupSequence;
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence2.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/CyclicGroupSequence2.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/CyclicGroupSequence2.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -15,7 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.hibernate.validation.engine.group;
+package org.hibernate.validation.engine.groups;
import javax.validation.GroupSequence;
Deleted: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupChainGeneratorTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/GroupChainGeneratorTest.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupChainGeneratorTest.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,115 +0,0 @@
-// $Id:$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, and individual contributors
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.hibernate.validation.engine.group;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.validation.ValidationException;
-import javax.validation.groups.Default;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import org.junit.Before;
-import org.junit.Test;
-
-import org.hibernate.validation.eg.groups.First;
-import org.hibernate.validation.eg.groups.Last;
-import org.hibernate.validation.eg.groups.Second;
-
-/**
- * @author Hardy Ferentschik
- */
-public class GroupChainGeneratorTest {
-
- GroupChainGenerator generator;
-
- @Before
- public void init() {
- generator = new GroupChainGenerator();
- }
-
- @Test(expected = ValidationException.class)
- public void testGroupChainForNonInterface() {
- Set<Class<?>> groups = new HashSet<Class<?>>();
- groups.add( String.class );
- generator.getGroupChainFor( groups );
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testGroupChainForNull() {
- generator.getGroupChainFor( null );
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void testGroupChainForEmptySet() {
- generator.getGroupChainFor( new HashSet<Class<?>>() );
- }
-
- @Test(expected = ValidationException.class)
- public void testCyclicGroupSequences() {
- Set<Class<?>> groups = new HashSet<Class<?>>();
- groups.add( CyclicGroupSequence1.class );
- generator.getGroupChainFor( groups );
- }
-
- @Test(expected = ValidationException.class)
- public void testCyclicGroupSequence() {
- Set<Class<?>> groups = new HashSet<Class<?>>();
- groups.add( CyclicGroupSequence.class );
- generator.getGroupChainFor( groups );
- }
-
- @Test
- public void testGroupDuplicates() {
- Set<Class<?>> groups = new HashSet<Class<?>>();
- groups.add( First.class );
- groups.add( Second.class );
- groups.add( Last.class );
- GroupChain chain = generator.getGroupChainFor( groups );
- assertEquals( "Wrong number of groups", 3, chain.size() );
-
- groups.clear();
- groups.add( First.class );
- groups.add( First.class );
- chain = generator.getGroupChainFor( groups );
- assertEquals( "Wrong number of groups", 1, chain.size() );
-
- groups.clear();
- groups.add( First.class );
- groups.add( Last.class );
- groups.add( First.class );
- chain = generator.getGroupChainFor( groups );
- assertEquals( "Wrong number of groups", 2, chain.size() );
- }
-
- @Test
- public void testSequenceResolution() {
- Set<Class<?>> groups = new HashSet<Class<?>>();
- groups.add( Address.Complete.class );
- GroupChain chain = generator.getGroupChainFor( groups );
- assertEquals( "Wrong number of groups", 2, chain.size() );
-
- assertTrue( "Should have more groups", chain.hasNext() );
- assertEquals( "Wrong group", Default.class, chain.next().getGroup() );
-
- assertTrue( "Should have more groups", chain.hasNext() );
- assertEquals( "Wrong group", Address.HighLevelCoherence.class, chain.next().getGroup() );
-
- assertTrue( "There should be no more groups", chain.hasNext() );
- }
-}
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupChainGeneratorTest.java (from rev 16002, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/GroupChainGeneratorTest.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupChainGeneratorTest.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupChainGeneratorTest.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,117 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.engine.groups;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.validation.ValidationException;
+import javax.validation.groups.Default;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.hibernate.validation.eg.groups.First;
+import org.hibernate.validation.eg.groups.Last;
+import org.hibernate.validation.eg.groups.Second;
+
+import static junit.framework.Assert.assertFalse;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class GroupChainGeneratorTest {
+
+ GroupChainGenerator generator;
+
+ @Before
+ public void init() {
+ generator = new GroupChainGenerator();
+ }
+
+ @Test(expected = ValidationException.class)
+ public void testGroupChainForNonInterface() {
+ Set<Class<?>> groups = new HashSet<Class<?>>();
+ groups.add( String.class );
+ generator.getGroupChainFor( groups );
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testGroupChainForNull() {
+ generator.getGroupChainFor( null );
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testGroupChainForEmptySet() {
+ generator.getGroupChainFor( new HashSet<Class<?>>() );
+ }
+
+ @Test(expected = ValidationException.class)
+ public void testCyclicGroupSequences() {
+ Set<Class<?>> groups = new HashSet<Class<?>>();
+ groups.add( CyclicGroupSequence1.class );
+ generator.getGroupChainFor( groups );
+ }
+
+ @Test(expected = ValidationException.class)
+ public void testCyclicGroupSequence() {
+ Set<Class<?>> groups = new HashSet<Class<?>>();
+ groups.add( CyclicGroupSequence.class );
+ generator.getGroupChainFor( groups );
+ }
+
+ @Test
+ public void testGroupDuplicates() {
+ Set<Class<?>> groups = new HashSet<Class<?>>();
+ groups.add( First.class );
+ groups.add( Second.class );
+ groups.add( Last.class );
+ GroupChain chain = generator.getGroupChainFor( groups );
+ assertEquals( "Wrong number of groups", 3, chain.size() );
+
+ groups.clear();
+ groups.add( First.class );
+ groups.add( First.class );
+ chain = generator.getGroupChainFor( groups );
+ assertEquals( "Wrong number of groups", 1, chain.size() );
+
+ groups.clear();
+ groups.add( First.class );
+ groups.add( Last.class );
+ groups.add( First.class );
+ chain = generator.getGroupChainFor( groups );
+ assertEquals( "Wrong number of groups", 2, chain.size() );
+ }
+
+ @Test
+ public void testSequenceResolution() {
+ Set<Class<?>> groups = new HashSet<Class<?>>();
+ groups.add( Address.Complete.class );
+ GroupChain chain = generator.getGroupChainFor( groups );
+ assertEquals( "Wrong number of groups", 2, chain.size() );
+
+ assertTrue( "Should have more groups", chain.hasNext() );
+ assertEquals( "Wrong groups", Default.class, chain.next().getGroup() );
+
+ assertTrue( "Should have more groups", chain.hasNext() );
+ assertEquals( "Wrong groups", Address.HighLevelCoherence.class, chain.next().getGroup() );
+
+ assertFalse( "There should be no more groups", chain.hasNext() );
+ }
+}
Deleted: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/GroupTest.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,181 +0,0 @@
-// $Id$
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2008, Red Hat Middleware LLC, and individual contributors
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-* http://www.apache.org/licenses/LICENSE-2.0
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.hibernate.validation.engine.group;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.validation.ConstraintViolation;
-import javax.validation.Validator;
-import javax.validation.groups.Default;
-
-import static org.junit.Assert.assertEquals;
-import org.junit.Test;
-
-import org.hibernate.validation.eg.Animal;
-import org.hibernate.validation.eg.Author;
-import org.hibernate.validation.eg.Book;
-import org.hibernate.validation.eg.DefaultAlias;
-import org.hibernate.validation.eg.Dictonary;
-import org.hibernate.validation.eg.groups.First;
-import org.hibernate.validation.eg.groups.Last;
-import org.hibernate.validation.eg.groups.Second;
-import org.hibernate.validation.util.TestUtil;
-
-/**
- * Tests for the implementation of <code>Validator</code>.
- *
- * @author Hardy Ferentschik
- */
-public class GroupTest {
-
- @Test
- public void testGroups() {
- Validator validator = TestUtil.getValidator();
-
- Author author = new Author();
- author.setLastName( "" );
- author.setFirstName( "" );
- Book book = new Book();
- book.setTitle( "" );
- book.setAuthor( author );
-
- Set<ConstraintViolation<Book>> constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
- assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
-
- author.setFirstName( "Gavin" );
- author.setLastName( "King" );
-
- constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
- ConstraintViolation constraintViolation = constraintViolations.iterator().next();
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
- assertEquals( "Wrong message", "may not be empty", constraintViolation.getMessage() );
- assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
- assertEquals( "Wrong value", book.getTitle(), constraintViolation.getInvalidValue() );
- assertEquals( "Wrong propertyName", "title", constraintViolation.getPropertyPath() );
-
- book.setTitle( "Hibernate Persistence with JPA" );
- book.setSubtitle( "Revised Edition of Hibernate in Action" );
-
- constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
- constraintViolation = constraintViolations.iterator().next();
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
- assertEquals( "Wrong message", "length must be between 0 and 30", constraintViolation.getMessage() );
- assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
- assertEquals( "Wrong value", book.getSubtitle(), constraintViolation.getInvalidValue() );
- assertEquals( "Wrong propertyName", "subtitle", constraintViolation.getPropertyPath() );
-
- book.setSubtitle( "Revised Edition" );
- author.setCompany( "JBoss a divison of RedHat" );
-
- constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
- constraintViolation = constraintViolations.iterator().next();
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
- assertEquals( "Wrong message", "length must be between 0 and 20", constraintViolation.getMessage() );
- assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
- assertEquals( "Wrong value", author.getCompany(), constraintViolation.getInvalidValue() );
- assertEquals( "Wrong propertyName", "author.company", constraintViolation.getPropertyPath() );
-
- author.setCompany( "JBoss" );
-
- constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
- assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
- }
-
- @Test
- public void testDefaultGroupSequence() {
- Validator validator = TestUtil.getValidator();
-
- Author author = new Author();
- author.setLastName( "" );
- author.setFirstName( "" );
- Book book = new Book();
- book.setAuthor( author );
-
- Set<ConstraintViolation<Book>> constraintViolations = validator.validate( book, Default.class );
- assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
-
- author.setFirstName( "Gavin" );
- author.setLastName( "King" );
-
- constraintViolations = validator.validate( book, Default.class );
- ConstraintViolation constraintViolation = constraintViolations.iterator().next();
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
- assertEquals( "Wrong message", "may not be null", constraintViolation.getMessage() );
- assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
- assertEquals( "Wrong value", book.getTitle(), constraintViolation.getInvalidValue() );
- assertEquals( "Wrong propertyName", "title", constraintViolation.getPropertyPath() );
-
- book.setTitle( "Hibernate Persistence with JPA" );
- book.setSubtitle( "Revised Edition of Hibernate in Action" );
-
- constraintViolations = validator.validate( book, Default.class );
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
-
- book.setSubtitle( "Revised Edition" );
- author.setCompany( "JBoss a divison of RedHat" );
-
- constraintViolations = validator.validate( book, Default.class );
- assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
-
- author.setCompany( "JBoss" );
-
- constraintViolations = validator.validate( book, Default.class );
- assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
- }
-
- @Test
- public void testGroupSequences() {
- Validator validator = TestUtil.getValidator();
-
- Dictonary dictonary = new Dictonary();
- dictonary.setTitle( "English - German" );
- Author author = new Author();
- author.setLastName( "-" );
- author.setFirstName( "-" );
- author.setCompany( "Langenscheidt Publ." );
- dictonary.setAuthor( author );
-
- Set<ConstraintViolation<Dictonary>> constraintViolations = validator.validate( dictonary, DefaultAlias.class );
- assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
- }
-
- @Test
- public void testValidationFailureInMultipleGroups() {
- Validator validator = TestUtil.getValidator();
- Animal elepfant = new Animal();
- elepfant.setName( "" );
- elepfant.setDomain( Animal.Domain.EUKARYOTA );
-
- Set<ConstraintViolation<Animal>> constraintViolations = validator.validate( elepfant, First.class, Second.class );
- assertEquals(
- "The should be two invalid constraints since the same propertyName gets validated in both groups",
- 1,
- constraintViolations.size()
- );
-
- ConstraintViolation constraintViolation = constraintViolations.iterator().next();
- Set<Class<?>> expected = new HashSet<Class<?>>();
- expected.add( First.class );
- expected.add( Second.class );
- assertEquals(
- "The constraint should be invalid for both groups",
- expected,
- constraintViolation.getGroups()
- );
- }
-}
\ No newline at end of file
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java (from rev 16002, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/GroupTest.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/GroupTest.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,218 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.validation.engine.groups;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.validation.ConstraintViolation;
+import javax.validation.Validator;
+import javax.validation.groups.Default;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+
+import org.hibernate.validation.eg.Animal;
+import org.hibernate.validation.eg.Author;
+import org.hibernate.validation.eg.Book;
+import org.hibernate.validation.eg.DefaultAlias;
+import org.hibernate.validation.eg.Dictonary;
+import org.hibernate.validation.eg.groups.First;
+import org.hibernate.validation.eg.groups.Last;
+import org.hibernate.validation.eg.groups.Second;
+import org.hibernate.validation.util.TestUtil;
+
+/**
+ * Tests for the group and group sequence feature.
+ *
+ * @author Hardy Ferentschik
+ */
+public class GroupTest {
+
+ @Test
+ public void testGroups() {
+ Validator validator = TestUtil.getValidator();
+
+ Author author = new Author();
+ author.setLastName( "" );
+ author.setFirstName( "" );
+ Book book = new Book();
+ book.setTitle( "" );
+ book.setAuthor( author );
+
+ Set<ConstraintViolation<Book>> constraintViolations = validator.validate(
+ book, First.class, Second.class, Last.class
+ );
+ assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
+
+ author.setFirstName( "Gavin" );
+ author.setLastName( "King" );
+
+ constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
+ ConstraintViolation constraintViolation = constraintViolations.iterator().next();
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ assertEquals( "Wrong message", "may not be empty", constraintViolation.getMessage() );
+ assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
+ assertEquals( "Wrong value", book.getTitle(), constraintViolation.getInvalidValue() );
+ assertEquals( "Wrong propertyName", "title", constraintViolation.getPropertyPath() );
+
+ book.setTitle( "Hibernate Persistence with JPA" );
+ book.setSubtitle( "Revised Edition of Hibernate in Action" );
+
+ constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
+ constraintViolation = constraintViolations.iterator().next();
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ assertEquals( "Wrong message", "length must be between 0 and 30", constraintViolation.getMessage() );
+ assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
+ assertEquals( "Wrong value", book.getSubtitle(), constraintViolation.getInvalidValue() );
+ assertEquals( "Wrong propertyName", "subtitle", constraintViolation.getPropertyPath() );
+
+ book.setSubtitle( "Revised Edition" );
+ author.setCompany( "JBoss a divison of RedHat" );
+
+ constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
+ constraintViolation = constraintViolations.iterator().next();
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ assertEquals( "Wrong message", "length must be between 0 and 20", constraintViolation.getMessage() );
+ assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
+ assertEquals( "Wrong value", author.getCompany(), constraintViolation.getInvalidValue() );
+ assertEquals( "Wrong propertyName", "author.company", constraintViolation.getPropertyPath() );
+
+ author.setCompany( "JBoss" );
+
+ constraintViolations = validator.validate( book, First.class, Second.class, Last.class );
+ assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
+ }
+
+ @Test
+ public void testGroupSequence() {
+ Validator validator = TestUtil.getValidator();
+
+ Author author = new Author();
+ author.setLastName( "" );
+ author.setFirstName( "" );
+ Book book = new Book();
+ book.setAuthor( author );
+
+ Set<ConstraintViolation<Book>> constraintViolations = validator.validate( book, Book.All.class );
+ assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
+
+ author.setFirstName( "Gavin" );
+ author.setLastName( "King" );
+
+ constraintViolations = validator.validate( book, Book.All.class );
+ ConstraintViolation constraintViolation = constraintViolations.iterator().next();
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ assertEquals( "Wrong message", "may not be null", constraintViolation.getMessage() );
+ assertEquals( "Wrong root entity", book, constraintViolation.getRootBean() );
+ assertEquals( "Wrong value", book.getTitle(), constraintViolation.getInvalidValue() );
+ assertEquals( "Wrong propertyName", "title", constraintViolation.getPropertyPath() );
+
+ book.setTitle( "Hibernate Persistence with JPA" );
+ book.setSubtitle( "Revised Edition of Hibernate in Action" );
+
+ constraintViolations = validator.validate( book, Book.All.class );
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+
+ book.setSubtitle( "Revised Edition" );
+ author.setCompany( "JBoss a divison of RedHat" );
+
+ constraintViolations = validator.validate( book, Book.All.class );
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+
+ author.setCompany( "JBoss" );
+
+ constraintViolations = validator.validate( book, Book.All.class );
+ assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
+ }
+
+ @Test
+ public void testGroupSequences() {
+ Validator validator = TestUtil.getValidator();
+
+ Dictonary dictonary = new Dictonary();
+ dictonary.setTitle( "English - German" );
+ Author author = new Author();
+ author.setLastName( "-" );
+ author.setFirstName( "-" );
+ author.setCompany( "Langenscheidt Publ." );
+ dictonary.setAuthor( author );
+
+ Set<ConstraintViolation<Dictonary>> constraintViolations = validator.validate( dictonary, DefaultAlias.class );
+ assertEquals( "Wrong number of constraints", 0, constraintViolations.size() );
+ }
+
+ @Test
+ public void testValidationFailureInMultipleGroups() {
+ Validator validator = TestUtil.getValidator();
+ Animal elepfant = new Animal();
+ elepfant.setName( "" );
+ elepfant.setDomain( Animal.Domain.EUKARYOTA );
+
+ Set<ConstraintViolation<Animal>> constraintViolations = validator.validate(
+ elepfant, First.class, Second.class
+ );
+ assertEquals(
+ "The should be two invalid constraints since the same propertyName gets validated in both groups",
+ 1,
+ constraintViolations.size()
+ );
+
+ ConstraintViolation constraintViolation = constraintViolations.iterator().next();
+ Set<Class<?>> expected = new HashSet<Class<?>>();
+ expected.add( First.class );
+ expected.add( Second.class );
+ assertEquals(
+ "The constraint should be invalid for both groups",
+ expected,
+ constraintViolation.getGroups()
+ );
+ }
+
+ @Test
+ public void testValidateAgainstDifferentGroups() {
+ User user = new User();
+
+ // all fields per default null. Depending on the validation groups there should be a different amount
+ // of constraint failures.
+ Validator validator = TestUtil.getValidator();
+
+ Set<ConstraintViolation<User>> constraintViolations = validator.validate( user );
+ assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
+
+ constraintViolations = validator.validate( user, Default.class );
+ assertEquals( "Wrong number of constraints", 2, constraintViolations.size() );
+
+ constraintViolations = validator.validate( user, Billable.class );
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+
+ constraintViolations = validator.validate( user, BuyInOneClick.class );
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+
+ constraintViolations = validator.validate( user, BuyInOneClick.class, Billable.class );
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+
+ constraintViolations = validator.validate( user, BuyInOneClick.class, Default.class );
+ assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
+
+ constraintViolations = validator.validate( user, BuyInOneClick.class, Default.class, Billable.class );
+ assertEquals( "Wrong number of constraints", 3, constraintViolations.size() );
+
+ constraintViolations = validator.validate( user, BuyInOneClick.class, BuyInOneClick.class );
+ assertEquals( "Wrong number of constraints", 1, constraintViolations.size() );
+ }
+}
\ No newline at end of file
Copied: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java (from rev 16002, validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/User.java)
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java (rev 0)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/User.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -0,0 +1,43 @@
+package org.hibernate.validation.engine.groups;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.groups.Default;
+
+/**
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+public class User {
+ @NotNull
+ private String firstname;
+
+ @NotNull(groups = Default.class)
+ private String lastname;
+
+ @NotNull(groups = { Billable.class, BuyInOneClick.class })
+ private CreditCard defaultCreditCard;
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public CreditCard getDefaultCreditCard() {
+ return defaultCreditCard;
+ }
+
+ public void setDefaultCreditCard(CreditCard defaultCreditCard) {
+ this.defaultCreditCard = defaultCreditCard;
+ }
+}
\ No newline at end of file
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/ZipCode.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/ZipCode.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/ZipCode.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,4 +1,4 @@
-package org.hibernate.validation.engine.group;
+package org.hibernate.validation.engine.groups;
/**
* @author Emmanuel Bernard
Modified: validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/ZipCodeCoherenceChecker.java
===================================================================
--- validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/group/ZipCodeCoherenceChecker.java 2009-02-19 01:11:40 UTC (rev 15999)
+++ validator/trunk/hibernate-validator/src/test/java/org/hibernate/validation/engine/groups/ZipCodeCoherenceChecker.java 2009-02-20 09:12:05 UTC (rev 16006)
@@ -1,4 +1,4 @@
-package org.hibernate.validation.engine.group;
+package org.hibernate.validation.engine.groups;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
16 years, 7 months
Hibernate SVN: r16005 - validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report.
by hibernate-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2009-02-19 21:28:00 -0500 (Thu, 19 Feb 2009)
New Revision: 16005
Modified:
validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
Log:
styling for implied assertions
Modified: validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
===================================================================
--- validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-20 01:54:11 UTC (rev 16004)
+++ validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-20 02:28:00 UTC (rev 16005)
@@ -145,18 +145,22 @@
sb.append(" font-size: 9px;\n");
sb.append(" font-weight: bold; }\n");
sb.append(" .noCoverage {\n");
- sb.append(" margin-top: 2px;\n");
- sb.append(" margin-bottom: 2px;\n");
+ sb.append(" margin-top: 2px;\n");
+ sb.append(" margin-bottom: 2px;\n");
+ sb.append(" font-weight: bold;\n");
+ sb.append(" font-style: italic;\n");
+ sb.append(" color: #ff0000; }\n");
+ sb.append(" .coverageHeader {\n");
+ sb.append(" font-weight: bold;\n");
+ sb.append(" text-decoration: underline;\n");
+ sb.append(" margin-top: 2px;\n");
+ sb.append(" margin-bottom: 2px; }\n");
+ sb.append(" .coverageMethod {\n");
+ sb.append(" font-style: italic; }\n");
+ sb.append(" .implied {\n");
+ sb.append(" color: #fff;\n");
sb.append(" font-weight: bold;\n");
- sb.append(" font-style: italic;\n");
- sb.append(" color: #ff0000; }\n");
- sb.append(" .coverageHeader {\n");
- sb.append(" font-weight: bold;\n");
- sb.append(" text-decoration: underline;\n");
- sb.append(" margin-top: 2px;\n");
- sb.append(" margin-bottom: 2px; }\n");
- sb.append(" .coverageMethod {\n");
- sb.append(" font-style: italic; }\n");
+ sb.append(" background-color: #000; }\n");
sb.append(" .pass {\n");
sb.append(" border-top: 1px solid #488c41;\n");
sb.append(" border-bottom: 1px solid #488c41;\n");
@@ -408,6 +412,11 @@
sb.append(" <div class=\"" + divClass + "\">\n");
+ if (assertion.isImplied())
+ {
+ sb.append("<span class=\"implied\">The following assertion is not made explicitly by the spec, however it is implied</span>");
+ }
+
sb.append(" <span class=\"code\">");
sb.append(assertion.getId());
sb.append(")");
16 years, 7 months
Hibernate SVN: r16004 - validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report.
by hibernate-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2009-02-19 20:54:11 -0500 (Thu, 19 Feb 2009)
New Revision: 16004
Modified:
validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditAssertion.java
validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditParser.java
validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
Log:
report improvements
Modified: validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditAssertion.java
===================================================================
--- validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditAssertion.java 2009-02-19 19:50:39 UTC (rev 16003)
+++ validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditAssertion.java 2009-02-20 01:54:11 UTC (rev 16004)
@@ -12,13 +12,18 @@
private String id;
private String text;
private String note;
+ private boolean testable;
+ private boolean implied;
- public AuditAssertion(String section, String id, String text, String note)
+ public AuditAssertion(String section, String id, String text, String note,
+ boolean testable, boolean implied)
{
this.section = section;
this.id = id;
this.text = text;
this.note = note;
+ this.testable = testable;
+ this.implied = implied;
}
public String getSection()
@@ -40,6 +45,16 @@
{
return note;
}
+
+ public boolean isTestable()
+ {
+ return testable;
+ }
+
+ public boolean isImplied()
+ {
+ return implied;
+ }
public int compareTo(AuditAssertion other)
{
@@ -47,5 +62,4 @@
return i != 0 ? i : id.compareTo(other.id);
}
-
}
Modified: validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditParser.java
===================================================================
--- validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditParser.java 2009-02-19 19:50:39 UTC (rev 16003)
+++ validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/AuditParser.java 2009-02-20 01:54:11 UTC (rev 16004)
@@ -194,7 +194,13 @@
}
}
+ boolean testable = node.hasAttribute("testable") ?
+ Boolean.parseBoolean(node.getAttribute("testable")) : true;
+
+ boolean implied = node.hasAttribute("implied") ?
+ Boolean.parseBoolean(node.getAttribute("implied")) : false;
+
value.add(new AuditAssertion(sectionId,
- node.getAttribute("id"), text, note));
+ node.getAttribute("id"), text, note, testable, implied));
}
}
Modified: validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
===================================================================
--- validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-19 19:50:39 UTC (rev 16003)
+++ validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-20 01:54:11 UTC (rev 16004)
@@ -36,6 +36,9 @@
private String svnBaseUrl = null;
private List<SpecReference> unmatched;
+
+ private int failThreshold;
+ private int passThreshold;
public CoverageReport(List<SpecReference> references, AuditParser auditParser) {
this.references = new HashMap<String, List<SpecReference>>();
@@ -67,6 +70,9 @@
{
svnBaseUrl = svnBaseUrl + "/";
}
+
+ passThreshold = this.properties.getIntValue("pass_threshold", 75, false);
+ failThreshold = this.properties.getIntValue("fail_threshold", 50, false);
}
catch (Exception ex)
{
@@ -152,9 +158,23 @@
sb.append(" .coverageMethod {\n");
sb.append(" font-style: italic; }\n");
sb.append(" .pass {\n");
+ sb.append(" border-top: 1px solid #488c41;\n");
+ sb.append(" border-bottom: 1px solid #488c41;\n");
+ sb.append(" padding-bottom: 1px;\n");
+ sb.append(" margin-bottom: 2px;\n");
sb.append(" background-color: #dfd; }\n");
sb.append(" .fail {\n");
+ sb.append(" border-top: 1px solid #ab2020;\n");
+ sb.append(" border-bottom: 1px solid #ab2020;\n");
+ sb.append(" padding-bottom: 1px;\n");
+ sb.append(" margin-bottom: 2px;\n");
sb.append(" background-color: #fdd; }\n");
+ sb.append(" .untestable {\n");
+ sb.append(" padding-bottom: 16px;\n");
+ sb.append(" margin-bottom: 2px;\n");
+ sb.append(" border-top: 1px solid #317ba6;\n");
+ sb.append(" border-bottom: 1px solid #317ba6;\n");
+ sb.append(" background-color: #80d1ff; }\n");
sb.append("</style>\n");
@@ -191,15 +211,28 @@
sb.append("<td>");
int assertionTotal = 0;
+ int testableAssertionTotal = 0;
for (List<AuditAssertion> assertions : auditParser.getAssertions().values())
{
assertionTotal += assertions.size();
+
+ for (AuditAssertion a : assertions)
+ {
+ if (a.isTestable()) testableAssertionTotal++;
+ }
}
sb.append(assertionTotal);
sb.append("</td>");
sb.append("</tr>");
+
+ sb.append("<tr>");
+ sb.append("<td>Total number of testable assertions</td>");
+ sb.append("<td>");
+ sb.append(testableAssertionTotal);
+ sb.append("</td>");
+ sb.append("</tr>");
sb.append("<tr>");
sb.append("<td>Total number of tested assertions</td>");
@@ -223,17 +256,13 @@
sb.append("</tr>");
- double coveragePercent = assertionTotal > 0 ? ((coverage * 1.0) / assertionTotal) * 100 : 0;
- String bgColor = coveragePercent < 60 ? "#ffaaaa" : coveragePercent < 80 ? "#ffffaa" : "#aaffaa";
+ double coveragePercent = testableAssertionTotal > 0 ? ((coverage * 1.0) / testableAssertionTotal) * 100 : 100;
+ String bgColor = coveragePercent < failThreshold ? "#ffaaaa" :
+ coveragePercent < passThreshold ? "#ffffaa" : "#aaffaa";
sb.append("<tr style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">");
-
-
sb.append("<td style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">Total percentage of tested assertions</td>");
-
-
-
sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">");
sb.append(String.format("%.2f%%", coveragePercent));
@@ -265,6 +294,7 @@
sb.append("<tr style=\"background-color:#dddddd\">");
sb.append("<th align=\"left\">Section</th>");
sb.append("<th>Assertions</th>");
+ sb.append("<th>Testable</th>");
sb.append("<th>Tested</th>");
sb.append("<th>Coverage %</th>");
sb.append("</tr>");
@@ -295,6 +325,13 @@
sb.append("</td>");
int assertions = auditParser.getAssertionsForSection(sectionId).size();
+ int testable = 0;
+
+ for (AuditAssertion a : auditParser.getAssertionsForSection(sectionId))
+ {
+ if (a.isTestable()) testable++;
+ }
+
int coverage = 0;
for (AuditAssertion assertion : auditParser.getAssertionsForSection(sectionId))
@@ -305,28 +342,27 @@
}
}
- double coveragePercent = assertions > 0 ? ((coverage * 1.0) / assertions) * 100 : -1;
+ double coveragePercent = testable > 0 ? ((coverage * 1.0) / testable) * 100 : 100;
sb.append("<td align=\"center\">");
sb.append(assertions);
sb.append("</td>");
sb.append("<td align=\"center\">");
+ sb.append(testable);
+ sb.append("</td>");
+
+ sb.append("<td align=\"center\">");
sb.append(coverage);
sb.append("</td>");
- if (coveragePercent >= 0)
- {
- String bgColor = coveragePercent < 60 ? "#ffaaaa" : coveragePercent < 80 ? "#ffffaa" : "#aaffaa" ;
-
- sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "\">");
- sb.append(String.format("%.2f%%", coveragePercent));
- sb.append("</td>");
- }
- else
- {
- sb.append("<td />");
- }
+ String bgColor = coveragePercent < failThreshold ? "#ffaaaa" :
+ coveragePercent < passThreshold ? "#ffffaa" : "#aaffaa";
+
+ sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "\">");
+ sb.append(String.format("%.2f%%", coveragePercent));
+ sb.append("</td>");
+
sb.append("</tr>");
}
@@ -352,7 +388,25 @@
for (AuditAssertion assertion : sectionAssertions) {
List<SpecReference> coverage = getCoverageForAssertion(sectionId, assertion.getId());
- sb.append(" <div class=\"" + (coverage.isEmpty() ? "fail" : "pass") + "\">\n");
+ String divClass = null;
+
+ if (assertion.isTestable())
+ {
+ if (coverage.isEmpty())
+ {
+ divClass = "fail";
+ }
+ else
+ {
+ divClass = "pass";
+ }
+ }
+ else
+ {
+ divClass = "untestable";
+ }
+
+ sb.append(" <div class=\"" + divClass + "\">\n");
sb.append(" <span class=\"code\">");
sb.append(assertion.getId());
@@ -364,61 +418,66 @@
sb.append(assertion.getText());
sb.append("</p>\n");
- sb.append(" <div class=\"coverage\">\n");
- sb.append(" <p class=\"coverageHeader\">Coverage</p>\n");
-
- String currentPackageName = null;
-
- if (coverage.isEmpty()) {
- sb.append(" <p class=\"noCoverage\">No tests exist for this assertion</p>\n");
- } else {
- for (SpecReference ref : coverage) {
- if (!ref.getPackageName().equals(currentPackageName))
- {
- currentPackageName = ref.getPackageName();
- sb.append(" <div class=\"packageName\">");
- sb.append(currentPackageName);
- sb.append(" </div>\n");
- }
-
- sb.append(" <div class=\"coverageMethod\">");
- sb.append(ref.getClassName());
- sb.append(".");
- sb.append(ref.getMethodName());
- sb.append("()");
-
- if (fisheyeBaseUrl != null)
- {
- sb.append("<a class=\"external\" target=\"_blank\" href=\"");
- sb.append(fisheyeBaseUrl);
- sb.append(currentPackageName.replace('.', '/'));
- sb.append("/");
+ if (assertion.isTestable())
+ {
+ sb.append(" <div class=\"coverage\">\n");
+ sb.append(" <p class=\"coverageHeader\">Coverage</p>\n");
+
+ String currentPackageName = null;
+
+ if (coverage.isEmpty()) {
+ sb.append(" <p class=\"noCoverage\">No tests exist for this assertion</p>\n");
+ } else {
+ for (SpecReference ref : coverage) {
+ if (!ref.getPackageName().equals(currentPackageName))
+ {
+ currentPackageName = ref.getPackageName();
+ sb.append(" <div class=\"packageName\">");
+ sb.append(currentPackageName);
+ sb.append(" </div>\n");
+ }
+
+ sb.append(" <div class=\"coverageMethod\">");
sb.append(ref.getClassName());
- sb.append(".java");
- sb.append("\">fisheye</a>");
- }
-
- if (svnBaseUrl != null)
- {
+ sb.append(".");
+ sb.append(ref.getMethodName());
+ sb.append("()");
+
if (fisheyeBaseUrl != null)
+ {
+ sb.append("<a class=\"external\" target=\"_blank\" href=\"");
+ sb.append(fisheyeBaseUrl);
+ sb.append(currentPackageName.replace('.', '/'));
+ sb.append("/");
+ sb.append(ref.getClassName());
+ sb.append(".java");
+ sb.append("\">fisheye</a>");
+ }
+
+ if (svnBaseUrl != null)
{
- sb.append("|");
+ if (fisheyeBaseUrl != null)
+ {
+ sb.append("|");
+ }
+
+ sb.append("<a class=\"external\" target=\"_blank\" href=\"");
+ sb.append(svnBaseUrl);
+ sb.append(currentPackageName.replace('.', '/'));
+ sb.append("/");
+ sb.append(ref.getClassName());
+ sb.append(".java");
+ sb.append("\">svn</a>");
}
- sb.append("<a class=\"external\" target=\"_blank\" href=\"");
- sb.append(svnBaseUrl);
- sb.append(currentPackageName.replace('.', '/'));
- sb.append("/");
- sb.append(ref.getClassName());
- sb.append(".java");
- sb.append("\">svn</a>");
- }
-
- sb.append("</div>\n");
- }
+ sb.append("</div>\n");
+ }
+ }
+
+ sb.append(" </div>\n");
}
-
- sb.append(" </div>\n </div>\n</div>");
+
+ sb.append("</div></div>");
}
out.write(sb.toString().getBytes());
16 years, 7 months
Hibernate SVN: r16003 - validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report.
by hibernate-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2009-02-19 14:50:39 -0500 (Thu, 19 Feb 2009)
New Revision: 16003
Modified:
validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
Log:
minor style adjustments
Modified: validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java
===================================================================
--- validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-19 18:26:09 UTC (rev 16002)
+++ validator/trunk/tck-utils/impl/src/main/java/org/hibernate/tck/report/CoverageReport.java 2009-02-19 19:50:39 UTC (rev 16003)
@@ -223,15 +223,19 @@
sb.append("</tr>");
- sb.append("<tr>");
- sb.append("<td>Total percentage of tested assertions</td>");
-
double coveragePercent = assertionTotal > 0 ? ((coverage * 1.0) / assertionTotal) * 100 : 0;
-
String bgColor = coveragePercent < 60 ? "#ffaaaa" : coveragePercent < 80 ? "#ffffaa" : "#aaffaa";
- sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "\">");
+ sb.append("<tr style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">");
+
+
+ sb.append("<td style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">Total percentage of tested assertions</td>");
+
+
+
+ sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "; border-color: " + bgColor + "\">");
+
sb.append(String.format("%.2f%%", coveragePercent));
sb.append("</td>");
@@ -301,7 +305,7 @@
}
}
- double coveragePercent = assertions > 0 ? ((coverage * 1.0) / assertions) * 100 : 0;
+ double coveragePercent = assertions > 0 ? ((coverage * 1.0) / assertions) * 100 : -1;
sb.append("<td align=\"center\">");
sb.append(assertions);
@@ -311,12 +315,18 @@
sb.append(coverage);
sb.append("</td>");
- String bgColor = coveragePercent < 60 ? "#ffaaaa" : coveragePercent < 80 ? "#ffffaa" : "#aaffaa";
+ if (coveragePercent >= 0)
+ {
+ String bgColor = coveragePercent < 60 ? "#ffaaaa" : coveragePercent < 80 ? "#ffffaa" : "#aaffaa" ;
- sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "\">");
- sb.append(String.format("%.2f%%", coveragePercent));
- sb.append("</td>");
-
+ sb.append("<td align=\"center\" style=\"background-color:" + bgColor + "\">");
+ sb.append(String.format("%.2f%%", coveragePercent));
+ sb.append("</td>");
+ }
+ else
+ {
+ sb.append("<td />");
+ }
sb.append("</tr>");
}
16 years, 7 months