3737import java .lang .reflect .Modifier ;
3838import java .net .URL ;
3939import java .util .Map ;
40- import java .util .concurrent . ConcurrentHashMap ;
40+ import java .util .TreeSet ;
4141
4242/**
4343 * Evaluates the conventions that define a domain class in Grails.
@@ -115,7 +115,8 @@ public boolean isArtefactClass(Class clazz) {
115115 return isDomainClass (clazz );
116116 }
117117
118- static final Map <Integer , Boolean > DOMAIN_CLASS_CHECK_CACHE = new ConcurrentHashMap <Integer , Boolean >();
118+ static final TreeSet <String > DOMAIN_CLASS_CACHE = new TreeSet <String >();
119+ static final TreeSet <String > NOT_DOMAIN_CLASS_CACHE = new TreeSet <String >();
119120
120121 public static boolean isDomainClass (Class <?> clazz , boolean allowProxyClass ) {
121122 boolean retval = isDomainClass (clazz );
@@ -128,17 +129,22 @@ public static boolean isDomainClass(Class<?> clazz, boolean allowProxyClass) {
128129 public static boolean isDomainClass (Class <?> clazz ) {
129130 if (clazz == null ) return false ;
130131
131- Integer cacheKey = System . identityHashCode ( clazz );
132+ String cacheKey = clazz . getName ( );
132133
133- Boolean retval = DOMAIN_CLASS_CHECK_CACHE .get (cacheKey );
134- if (retval != null ) {
135- return retval ;
134+ if (DOMAIN_CLASS_CACHE .contains (cacheKey )) {
135+ return true ;
136+ } else if (NOT_DOMAIN_CLASS_CACHE .contains (cacheKey )) {
137+ return false ;
136138 }
137139
138- retval = doIsDomainClassCheck (clazz );
139-
140+ boolean retval = doIsDomainClassCheck (clazz );
141+
140142 if (!developmentMode ) {
141- DOMAIN_CLASS_CHECK_CACHE .put (cacheKey , retval );
143+ if (retval ) {
144+ DOMAIN_CLASS_CACHE .add (cacheKey );
145+ } else {
146+ NOT_DOMAIN_CLASS_CACHE .add (cacheKey );
147+ }
142148 }
143149 return retval ;
144150 }
0 commit comments