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 2009/03/21 07:30:03 UTC

svn commit: r756882 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src: main/java/org/apache/ibatis/binding/ main/java/org/apache/ibatis/jdbc/ test/java/org/apache/ibatis/binding/

Author: cbegin
Date: Sat Mar 21 06:30:03 2009
New Revision: 756882

URL: http://svn.apache.org/viewvc?rev=756882&view=rev
Log:
Hooked in SqlProvider and SelectBuilder

Added:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogSql.java
Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java?rev=756882&r1=756881&r2=756882&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperAnnotationParser.java Sat Mar 21 06:30:03 2009
@@ -150,10 +150,9 @@
   }
 
   private void parseStatement(Method method) {
-    Class annotationType = getSqlAnnotationType(method);
-    Options options = method.getAnnotation(Options.class);
-    if (annotationType != null) {
-      final SqlSource sqlSource = getSqlAnnotationValue(method, annotationType);
+    SqlSource sqlSource = getSqlSourceFromAnnotations(method);
+    if (sqlSource != null) {
+      Options options = method.getAnnotation(Options.class);
       final String mappedStatementId = method.getDeclaringClass().getName() + "." + method.getName();
       boolean isSelect = method.getAnnotation(Select.class) != null;
       boolean flushCache = false;
@@ -215,13 +214,17 @@
     return returnType;
   }
 
-  private SqlSource getSqlAnnotationValue(Method method, Class annotationType) {
-    Annotation annotation = method.getAnnotation(annotationType);
-    if (annotation != null) {
+  private SqlSource getSqlSourceFromAnnotations(Method method) {
+    Class annotationType = getSqlAnnotationType(method);
+    if (annotationType != null) {
       try {
+        Annotation annotation = method.getAnnotation(annotationType);
         final String[] strings = (String[]) annotation.getClass().getMethod("value").invoke(annotation);
         final SqlProvider provider = (SqlProvider) annotation.getClass().getMethod("sqlProvider").invoke(annotation);
         if (strings != null && strings.length > 0) {
+          if (provider.type() != void.class) {
+            throw new BindingException("You cannot supply both a static SQL and SqlProvider to method named " + method.getName());
+          }
           StringBuilder sql = new StringBuilder();
           for (String fragment : strings) {
             sql.append(fragment);
@@ -229,14 +232,14 @@
           }
           SqlSourceParser parser = new SqlSourceParser(configurator.getConfiguration());
           return parser.parse(sql.toString());
-        } else if (provider != null) {
+        } else if (provider.type() != void.class) {
           return new DynamicInlineSqlSource(configurator.getConfiguration(), provider);
         }
       } catch (Exception e) {
         throw new RuntimeException("Could not find value method on SQL annotation.  Cause: " + e, e);
       }
     }
-    throw new BindingException("Requested value from annotation that does not exist: " + annotationType);
+    return null;
   }
 
   private Class getSqlAnnotationType(Method method) {

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java?rev=756882&r1=756881&r2=756882&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperMethod.java Sat Mar 21 06:30:03 2009
@@ -94,7 +94,7 @@
     try {
       config.getMappedStatement(commandName);
     } catch (Exception e) {
-      throw new BindingException("Invalid bound statement (not found): " + commandName);
+      throw new BindingException("Invalid bound statement (not found): " + commandName,e);
     }
   }
 

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java?rev=756882&r1=756881&r2=756882&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java Sat Mar 21 06:30:03 2009
@@ -10,10 +10,6 @@
 
   private static final ThreadLocal<SelectSQL> localSQL = new ThreadLocal<SelectSQL>();
 
-  static {
-    RESET();
-  }
-
   public static void RESET() {
     localSQL.set(new SelectSQL());
   }
@@ -112,7 +108,12 @@
   }
 
   private static SelectSQL sql() {
-    return localSQL.get();
+    SelectSQL selectSQL = localSQL.get();
+    if (selectSQL == null) {
+      RESET();
+      selectSQL = localSQL.get();
+    }
+    return selectSQL;
   }
 
   private static class SelectSQL {

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java?rev=756882&r1=756881&r2=756882&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BindingTest.java Sat Mar 21 06:30:03 2009
@@ -28,6 +28,18 @@
   }
 
   @Test
+  public void shouldExecuteBoundSelectListOfBlogsStatementUsingProvider() {
+    SqlSession session = sqlSessionFactory.openSession();
+    try {
+      BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);
+      List<Blog> blogs = mapper.selectBlogsUsingProvider();
+      assertEquals(2, blogs.size());
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
   public void shouldExecuteBoundSelectListOfBlogsAsMaps() {
     SqlSession session = sqlSessionFactory.openSession();
     try {

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java?rev=756882&r1=756881&r2=756882&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.java Sat Mar 21 06:30:03 2009
@@ -26,6 +26,12 @@
 
   //======================================================
 
+  @Select(
+      sqlProvider = @SqlProvider(type = BoundBlogSql.class, method = "selectBlogsSql"))
+  List<Blog> selectBlogsUsingProvider();
+
+  //======================================================
+
   @Select("SELECT * FROM post ORDER BY id")
   @TypeDiscriminator(
       column = "draft",

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogSql.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogSql.java?rev=756882&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogSql.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogSql.java Sat Mar 21 06:30:03 2009
@@ -0,0 +1,14 @@
+package org.apache.ibatis.binding;
+
+import static org.apache.ibatis.jdbc.SelectBuilder.*;
+
+public class BoundBlogSql {
+
+  public String selectBlogsSql() {
+    RESET();
+    SELECT("*");
+    FROM("BLOG");
+    return SQL();
+  }
+
+}