Skip to content

Commit d1e7a63

Browse files
GRAILS-2375: adding insertable false hibernate mapping will add nullable true constraint
1 parent 14f36b3 commit d1e7a63

File tree

2 files changed

+67
-7
lines changed

2 files changed

+67
-7
lines changed

src/java/org/codehaus/groovy/grails/commons/GrailsDomainConfigurationUtil.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ public static Map<String, ConstrainedProperty> evaluateConstraints(final Class<?
396396
// specified otherwise by the constraints
397397
// If the field is a Java entity annotated with @Entity skip this
398398
applyDefaultConstraints(propertyName, p, cp,
399-
defaultConstraints, delegate.getSharedConstraint(propertyName));
399+
defaultConstraints, delegate.getSharedConstraint(propertyName), propertyConfig);
400400
}
401401
}
402402
}
@@ -451,7 +451,7 @@ public static Map<String, ConstrainedProperty> evaluateConstraints(Class<?> theC
451451

452452
@SuppressWarnings("unchecked")
453453
private static void applyDefaultConstraints(String propertyName, GrailsDomainClassProperty p,
454-
ConstrainedProperty cp, Map<String, Object> defaultConstraints, String sharedConstraintReference) {
454+
ConstrainedProperty cp, Map<String, Object> defaultConstraints, String sharedConstraintReference, PropertyConfig propertyConfig) {
455455

456456
if (defaultConstraints != null && !defaultConstraints.isEmpty()) {
457457
if (defaultConstraints.containsKey("*")) {
@@ -473,10 +473,14 @@ private static void applyDefaultConstraints(String propertyName, GrailsDomainCla
473473
}
474474

475475
if (canApplyNullableConstraint(propertyName, p, cp)) {
476-
cp.applyConstraint(ConstrainedProperty.NULLABLE_CONSTRAINT,
477-
Collection.class.isAssignableFrom(p.getType()) ||
478-
Map.class.isAssignableFrom(p.getType())
479-
);
476+
if (propertyConfig!=null && !propertyConfig.getInsertable()) {
477+
cp.applyConstraint(ConstrainedProperty.NULLABLE_CONSTRAINT,true);
478+
} else {
479+
cp.applyConstraint(ConstrainedProperty.NULLABLE_CONSTRAINT,
480+
Collection.class.isAssignableFrom(p.getType()) ||
481+
Map.class.isAssignableFrom(p.getType())
482+
);
483+
}
480484
}
481485
}
482486

src/test/org/codehaus/groovy/grails/commons/GrailsDomainConfigurationUtilTests.java

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,16 @@
1717
import junit.framework.TestCase;
1818

1919
import java.util.Date;
20+
import java.util.Map;
2021
import java.net.URL;
2122
import java.net.URI;
23+
import org.codehaus.groovy.grails.orm.hibernate.cfg.DefaultGrailsDomainConfiguration;
24+
import org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder;
25+
import org.hibernate.cfg.ImprovedNamingStrategy;
26+
import org.codehaus.groovy.grails.validation.ConstrainedProperty;
27+
import org.codehaus.groovy.grails.validation.NullableConstraint;
28+
import groovy.lang.ExpandoMetaClass;
29+
import groovy.lang.GroovyClassLoader;
2230

2331
/**
2432
* Tests for the GrailsDomainConfigurationUtil class
@@ -32,6 +40,18 @@
3240
*/
3341
public class GrailsDomainConfigurationUtilTests extends TestCase {
3442

43+
@Override
44+
protected void setUp() throws Exception {
45+
super.setUp();
46+
ExpandoMetaClass.enableGlobally();
47+
}
48+
49+
@Override
50+
protected void tearDown() throws Exception {
51+
super.tearDown();
52+
GrailsDomainBinder.namingStrategy = ImprovedNamingStrategy.INSTANCE;
53+
}
54+
3555
public void testIsBasicType() {
3656
assertTrue(GrailsDomainConfigurationUtil.isBasicType(boolean.class));
3757
assertTrue(GrailsDomainConfigurationUtil.isBasicType(long.class));
@@ -67,6 +87,42 @@ public void testIsBasicType() {
6787
assertTrue(GrailsDomainConfigurationUtil.isBasicType(Character[].class));
6888
assertTrue(GrailsDomainConfigurationUtil.isBasicType(Double[].class));
6989
assertTrue(GrailsDomainConfigurationUtil.isBasicType(Float[].class));
70-
assertTrue(GrailsDomainConfigurationUtil.isBasicType(Byte[].class));
90+
assertTrue(GrailsDomainConfigurationUtil.isBasicType(Byte[].class));
91+
}
92+
93+
public void testEvaluateConstraintsInsertableShouldBeNullableByDefault() {
94+
GroovyClassLoader cl = new GroovyClassLoader();
95+
GrailsDomainClass domainClass = new DefaultGrailsDomainClass(
96+
cl.parseClass(
97+
"class TestInsertableUpdateableDomain {\n" +
98+
" Long id \n" +
99+
" Long version \n" +
100+
" String testString1 \n" +
101+
" String testString2 \n"+
102+
"\n" +
103+
" static mapping = {\n" +
104+
" testString1 insertable:false \n" +
105+
" testString2 max:50 \n" +
106+
" }\n" +
107+
"}")
108+
);
109+
110+
DefaultGrailsDomainConfiguration config = getDomainConfig(cl,
111+
new Class[] { domainClass.getClazz() });
112+
Map<String, ConstrainedProperty> mapping = GrailsDomainConfigurationUtil.evaluateConstraints(domainClass.getClazz(),domainClass.getProperties(),null);
113+
ConstrainedProperty property1 = mapping.get("testString1");
114+
assertTrue("constraint was not nullable and should be", ((NullableConstraint)property1.getAppliedConstraint(ConstrainedProperty.NULLABLE_CONSTRAINT)).isNullable());
115+
ConstrainedProperty property2 = mapping.get("testString2");
116+
assertFalse("constraint was nullable and shouldn't be", ((NullableConstraint)property2.getAppliedConstraint(ConstrainedProperty.NULLABLE_CONSTRAINT)).isNullable());
117+
118+
}
119+
120+
private DefaultGrailsDomainConfiguration getDomainConfig(GroovyClassLoader cl, Class<?>[] classes) {
121+
GrailsApplication grailsApplication = new DefaultGrailsApplication(classes, cl);
122+
grailsApplication.initialise();
123+
DefaultGrailsDomainConfiguration config = new DefaultGrailsDomainConfiguration();
124+
config.setGrailsApplication(grailsApplication);
125+
config.buildMappings();
126+
return config;
71127
}
72128
}

0 commit comments

Comments
 (0)