You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2010/02/14 00:48:13 UTC

svn commit: r909932 - in /ibatis/java/ibatis-3/trunk/ibatis-3-core/src: main/java/org/apache/ibatis/session/Configuration.java test/java/org/apache/ibatis/session/SqlSessionTest.java

Author: cbegin
Date: Sat Feb 13 23:48:12 2010
New Revision: 909932

URL: http://svn.apache.org/viewvc?rev=909932&view=rev
Log:
Added simple name resolution to configuration.

Modified:
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/session/Configuration.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/session/Configuration.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/session/Configuration.java?rev=909932&r1=909931&r2=909932&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/session/Configuration.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/session/Configuration.java Sat Feb 13 23:48:12 2010
@@ -366,7 +366,8 @@
     return mappedStatements.containsKey(statementName);
   }
 
-  protected static class StrictMap<J, K> extends HashMap<J, K> {
+
+  protected static class StrictMap<J extends String, K extends Object> extends HashMap<J, K> {
 
     private String name;
 
@@ -392,15 +393,47 @@
 
     public K put(J key, K value) {
       if (containsKey(key)) throw new IllegalArgumentException(name + " already contains value for " + key);
+      if (key.contains(".")) {
+        final String shortKey = getShortName(key);
+        if (super.get(shortKey) == null) {
+          super.put((J)shortKey, value);
+        } else {
+          super.put((J)shortKey, (K)new Ambiguity(shortKey));
+        }
+      }
       return super.put(key, value);
     }
 
     public K get(Object key) {
       K value = super.get(key);
-      if (value == null) throw new IllegalArgumentException(name + " does not contain value for " + key);
+      if (value == null) {
+        value = super.get(getShortName((J)key));
+        if (value == null) {
+          throw new IllegalArgumentException(name + " does not contain value for " + key);
+        }
+      }
+      if (value instanceof Ambiguity) {
+        throw new IllegalArgumentException(((Ambiguity)value).getSubject()
+          + " is ambiguous in " + name + " (try using the full name including the namespace, or rename one of the entries)");
+      }
       return value;
     }
 
+    private String getShortName(J key) {
+      final String[] keyparts = key.split("\\.");
+      final String shortKey = keyparts[keyparts.length-1];
+      return shortKey;
+    }
+
+    protected static class Ambiguity {
+      private String subject;
+      public Ambiguity(String subject) {
+        this.subject = subject;
+      }
+      public String getSubject() {
+        return subject;
+      }
+    }
   }
 
 }

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java?rev=909932&r1=909931&r2=909932&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java Sat Feb 13 23:48:12 2010
@@ -4,6 +4,7 @@
 import domain.blog.mappers.AuthorMapper;
 import domain.blog.mappers.BlogMapper;
 import org.apache.ibatis.BaseDataTest;
+import org.apache.ibatis.cache.impl.PerpetualCache;
 import org.apache.ibatis.io.Resources;
 import static org.junit.Assert.*;
 import org.junit.BeforeClass;
@@ -27,6 +28,68 @@
   }
 
   @Test
+  public void shouldResolveBothSimpleNameAndFullyQualifiedName() {
+    Configuration c = new Configuration();
+    final String fullName = "com.mycache.MyCache";
+    final String shortName = "MyCache";
+    final PerpetualCache cache = new PerpetualCache(fullName);
+    c.addCache(cache);
+    assertEquals(cache, c.getCache(fullName));
+    assertEquals(cache, c.getCache(shortName));
+  }
+
+  @Test
+  public void shouldFailOverToMostApplicableSimpleName() {
+    Configuration c = new Configuration();
+    final String fullName = "com.mycache.MyCache";
+    final String invalidName = "unknown.namespace.MyCache";
+    final PerpetualCache cache = new PerpetualCache(fullName);
+    c.addCache(cache);
+    assertEquals(cache, c.getCache(fullName));
+    assertEquals(cache, c.getCache(invalidName));
+  }
+
+  @Test
+  public void shouldSucceedWhenFullyQualifiedButFailDueToAmbiguity() {
+    Configuration c = new Configuration();
+
+    final String name1 = "com.mycache.MyCache";
+    final PerpetualCache cache1 = new PerpetualCache(name1);
+    c.addCache(cache1);
+
+    final String name2 = "com.other.MyCache";
+    final PerpetualCache cache2 = new PerpetualCache(name2);
+    c.addCache(cache2);
+
+    final String shortName = "MyCache";
+
+    assertEquals(cache1, c.getCache(name1));
+    assertEquals(cache2, c.getCache(name2));
+
+    try {
+      c.getCache(shortName);
+      fail("Exception expected.");
+    } catch (Exception e) {
+      assertTrue(e.getMessage().contains("ambiguous"));
+    }
+
+  }
+
+  @Test
+  public void shouldFailToAddDueToNameConflict() {
+    Configuration c = new Configuration();
+    final String fullName = "com.mycache.MyCache";
+    final PerpetualCache cache = new PerpetualCache(fullName);
+    try {
+      c.addCache(cache);
+      c.addCache(cache);
+      fail("Exception expected.");
+    } catch (Exception e) {
+      assertTrue(e.getMessage().contains("already contains value"));
+    }
+  }
+
+  @Test
   public void shouldSelectAllAuthors() throws Exception {
     SqlSession session = sqlMapper.openSession(TransactionIsolationLevel.SERIALIZABLE);
     try {