From 5796053875ce9fe32da83cc09b73bbd6c76e11c3 Mon Sep 17 00:00:00 2001
From: "Brian S. O'Neill" <bronee@gmail.com>
Date: Mon, 17 May 2010 21:43:54 +0000
Subject: Remove cached metadata if exception thrown while creating it.

---
 .../repo/jdbc/JDBCStorableIntrospector.java        | 37 +++++++++++++++-------
 1 file changed, 26 insertions(+), 11 deletions(-)

(limited to 'src/main/java/com/amazon/carbonado/repo')

diff --git a/src/main/java/com/amazon/carbonado/repo/jdbc/JDBCStorableIntrospector.java b/src/main/java/com/amazon/carbonado/repo/jdbc/JDBCStorableIntrospector.java
index 336f111..042974f 100644
--- a/src/main/java/com/amazon/carbonado/repo/jdbc/JDBCStorableIntrospector.java
+++ b/src/main/java/com/amazon/carbonado/repo/jdbc/JDBCStorableIntrospector.java
@@ -47,6 +47,7 @@ import org.apache.commons.logging.LogFactory;
 import org.cojen.classfile.TypeDesc;
 import org.cojen.util.KeyFactory;
 import org.cojen.util.SoftValuedHashMap;
+import org.cojen.util.ThrowUnchecked;
 
 import com.amazon.carbonado.capability.IndexInfo;
 import com.amazon.carbonado.MalformedTypeException;
@@ -104,7 +105,8 @@ public class JDBCStorableIntrospector extends StorableIntrospector {
     }
 
     static <S extends Storable> JDBCStorableInfo<S> examine
-        (Class<S> type, DataSource ds, String catalog, String schema, SchemaResolver resolver, boolean primaryKeyCheckDisabled)
+        (Class<S> type, DataSource ds, String catalog, String schema,
+         SchemaResolver resolver, boolean primaryKeyCheckDisabled)
         throws SQLException, SupportException
     {
         Object key = KeyFactory.createKey(new Object[] {type, ds, catalog, schema});
@@ -120,15 +122,18 @@ public class JDBCStorableIntrospector extends StorableIntrospector {
             Connection con = ds.getConnection();
             try {
                 try {
-                    jInfo = examine(mainInfo, con, catalog, schema, resolver, primaryKeyCheckDisabled);
+                    jInfo = examine
+                        (mainInfo, con, catalog, schema, resolver, primaryKeyCheckDisabled);
                     if (!jInfo.isSupported() && resolver != null &&
                         resolver.resolve(mainInfo, con, catalog, schema))
                     {
-                        jInfo = examine(mainInfo, con, catalog, schema, resolver, primaryKeyCheckDisabled);
+                        jInfo = examine
+                            (mainInfo, con, catalog, schema, resolver, primaryKeyCheckDisabled);
                     }
                 } catch (SupportException e) {
                     if (resolver != null && resolver.resolve(mainInfo, con, catalog, schema)) {
-                        jInfo = examine(mainInfo, con, catalog, schema, resolver, primaryKeyCheckDisabled);
+                        jInfo = examine
+                            (mainInfo, con, catalog, schema, resolver, primaryKeyCheckDisabled);
                     } else {
                         throw e;
                     }
@@ -146,9 +151,15 @@ public class JDBCStorableIntrospector extends StorableIntrospector {
             // Finish resolving join properties, after properties have been
             // added to cache. This makes it possible for joins to (directly or
             // indirectly) reference their own enclosing type.
-            for (JDBCStorableProperty<S> jProperty : jInfo.getAllProperties().values()) {
-                ((JProperty<S>) jProperty).fillInternalJoinElements(ds, catalog, schema, resolver);
-                ((JProperty<S>) jProperty).fillExternalJoinElements(ds, catalog, schema, resolver);
+            try {
+                for (JDBCStorableProperty<S> jProperty : jInfo.getAllProperties().values()) {
+                    JProperty<S> jp = (JProperty<S>) jProperty;
+                    jp.fillInternalJoinElements(ds, catalog, schema, resolver);
+                    jp.fillExternalJoinElements(ds, catalog, schema, resolver);
+                }
+            } catch (Throwable e) {
+                cCache.remove(key);
+                ThrowUnchecked.fire(e);
             }
 
             return jInfo;
@@ -304,7 +315,8 @@ public class JDBCStorableIntrospector extends StorableIntrospector {
 
         for (StorableProperty<S> mainProperty : mainProperties.values()) {
             if (mainProperty.isDerived() || mainProperty.isJoin() || tableName == null) {
-                jProperties.put(mainProperty.getName(), new JProperty<S>(mainProperty, primaryKeyCheckDisabled));
+                jProperties.put(mainProperty.getName(),
+                                new JProperty<S>(mainProperty, primaryKeyCheckDisabled));
                 continue;
             }
 
@@ -395,7 +407,8 @@ public class JDBCStorableIntrospector extends StorableIntrospector {
                 columnToProperty.put(jProperty.getColumnName(), jProperty.getName());
             } else {
                 if (mainProperty.isIndependent()) {
-                    jProperties.put(mainProperty.getName(), new JProperty<S>(mainProperty, primaryKeyCheckDisabled));
+                    jProperties.put(mainProperty.getName(),
+                                    new JProperty<S>(mainProperty, primaryKeyCheckDisabled));
                 } else if (!addedError) {
                     StringBuilder buf = new StringBuilder();
                     buf.append("Unable to find matching database column for property \"");
@@ -1501,7 +1514,8 @@ public class JDBCStorableIntrospector extends StorableIntrospector {
                 return;
             }
 
-            JDBCStorableInfo<S> info = examine(getEnclosingType(), ds, catalog, schema, resolver, mPrimaryKeyCheckDisabled);
+            JDBCStorableInfo<S> info = examine
+                (getEnclosingType(), ds, catalog, schema, resolver, mPrimaryKeyCheckDisabled);
 
             JDBCStorableProperty<S>[] internal = new JDBCStorableProperty[mainInternal.length];
             for (int i=mainInternal.length; --i>=0; ) {
@@ -1520,7 +1534,8 @@ public class JDBCStorableIntrospector extends StorableIntrospector {
                 return;
             }
 
-            JDBCStorableInfo<?> info = examine(getJoinedType(), ds, catalog, schema, resolver, mPrimaryKeyCheckDisabled);
+            JDBCStorableInfo<?> info = examine
+                (getJoinedType(), ds, catalog, schema, resolver, mPrimaryKeyCheckDisabled);
 
             JDBCStorableProperty<?>[] external = new JDBCStorableProperty[mainExternal.length];
             for (int i=mainExternal.length; --i>=0; ) {
-- 
cgit v1.2.3