Author: cbegin
Date: Sun Mar 22 05:35:32 2009
New Revision: 757131

URL: http://svn.apache.org/viewvc?rev=757131&view=rev
Log:
Added bidirectional loading of bound interface, either XML first or Class first.

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
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/MapperRegistry.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.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
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.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=757131&r1=757130&r2=757131&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
 Sun Mar 22 05:35:32 2009
@@ -4,8 +4,10 @@
 import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.parser.MapperConfigurator;
 import org.apache.ibatis.parser.SqlSourceParser;
+import org.apache.ibatis.parser.MapperParser;
 import org.apache.ibatis.reflection.MetaClass;
 import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.io.Resources;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
@@ -14,6 +16,8 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.io.Reader;
+import java.io.IOException;
 
 public class MapperAnnotationParser {
 
@@ -27,6 +31,7 @@
   }
 
   public void parse() {
+    loadXmlResource();
     configurator.namespace(type.getName());
     parseCache();
     parseCacheRef();
@@ -37,6 +42,20 @@
     }
   }
 
+  private void loadXmlResource() {
+    String xmlResource = type.getName().replace('.', '/') + ".xml";
+    Reader xmlReader = null;
+    try {
+      xmlReader = Resources.getResourceAsReader(type.getClassLoader(), 
xmlResource);
+    } catch (IOException e) {
+      // ignore, resource is not required
+    }
+    if (xmlReader != null) {
+      MapperParser xmlParser = new MapperParser(xmlReader, 
configurator.getConfiguration(), xmlResource, type.getName());
+      xmlParser.parse();
+    }
+  }
+
   private void parseCache() {
     CacheDomain cacheDomain = (CacheDomain) 
type.getAnnotation(CacheDomain.class);
     if (cacheDomain != null) {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperRegistry.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperRegistry.java?rev=757131&r1=757130&r2=757131&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperRegistry.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/binding/MapperRegistry.java
 Sun Mar 22 05:35:32 2009
@@ -24,12 +24,20 @@
     }
   }
 
+  public boolean hasMapper(Class type) {
+    return knownMappers.contains(type);
+  }
+
   public void addMapper(Class type) {
     if (!type.isInterface())
       throw new BindingException("Only interfaces can be configured by the 
MapperFactory.  Type " + type + " is not an interface.");
     if (knownMappers.contains(type))
       throw new BindingException("Type " + type + " is already known to the 
MapperRegistry.");
     knownMappers.add(type);
-    new MapperAnnotationParser(config,type).parse();
+    // It's important that the type is added before the parser is run
+    // otherwise the binding may automatically be attempted by the
+    // mapper parser.  If the type is already known, it won't try.
+    MapperAnnotationParser parser = new MapperAnnotationParser(config, type);
+    parser.parse();
   }
 }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java?rev=757131&r1=757130&r2=757131&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/Configuration.java
 Sun Mar 22 05:35:32 2009
@@ -290,6 +290,10 @@
     return mapperRegistry.getMapper(type,sqlSession);
   }
 
+  public boolean hasMapper (Class type) {
+    return mapperRegistry.hasMapper(type);
+  }
+
   private static class StrictMap<J, K> extends HashMap<J, K> {
 
     private String name;

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java?rev=757131&r1=757130&r2=757131&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigurator.java
 Sun Mar 22 05:35:32 2009
@@ -16,7 +16,7 @@
 
 public class MapperConfigurator extends BaseParser {
 
-  protected String namespace;
+  private String namespace;
   private String resource;
 
   private ParameterMap.Builder parameterMapBuilder;
@@ -38,9 +38,15 @@
     this.typeHandlerRegistry = configuration.getTypeHandlerRegistry();
   }
 
+  public String namespace() {
+    return namespace;
+  }
+
   public void namespace(String namespace) {
-    this.namespace = namespace;
-    if (namespace == null) {
+    if (namespace != null) {
+      this.namespace = namespace;
+    }
+    if (this.namespace == null) {
       throw new ParserException("The mapper element requires a namespace 
attribute to be specified.");
     }
   }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java?rev=757131&r1=757130&r2=757131&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperParser.java
 Sun Mar 22 05:35:32 2009
@@ -16,6 +16,11 @@
   protected NodeletParser parser;
   protected MapperConfigurator mapperConfigurator;
 
+  public MapperParser(Reader reader, Configuration configuration, String 
resource, String namespace) {
+    this(reader, configuration, resource);
+    this.mapperConfigurator.namespace(namespace);
+  }
+
   public MapperParser(Reader reader, Configuration configuration, String 
resource) {
     this.mapperConfigurator = new MapperConfigurator(configuration,resource);
     this.reader = reader;
@@ -36,12 +41,14 @@
     assert typeAliasRegistry != null;
     assert typeHandlerRegistry != null;
     parser.parse(reader);
+    bindMapperForNamespace();
   }
 
   //  <configuration namespace="com.domain.MapperClass" />
   @Nodelet("/mapper")
   public void configurationElement(NodeletContext context) throws Exception {
-    mapperConfigurator.namespace(context.getStringAttribute("namespace"));
+    String namespace = context.getStringAttribute("namespace");
+    mapperConfigurator.namespace(namespace);
   }
 
   //  <cache type="LRU" flushInterval="3600000" size="1000" readOnly="false" />
@@ -267,4 +274,21 @@
     
mapperConfigurator.resultMapping(property,column,javaTypeClass,jdbcTypeEnum,nestedSelect,nestedResultMap,typeHandlerClass,flags);
   }
 
+  private void bindMapperForNamespace() {
+    String namespace = mapperConfigurator.namespace();
+    if (namespace != null) {
+      Class boundType = null;
+      try {
+        boundType = Class.forName(namespace);
+      } catch (ClassNotFoundException e) {
+        //ignore, bound type is not required
+      }
+      if (boundType != null) {
+        if (!configuration.hasMapper(boundType)) {
+          configuration.addMapper(boundType);
+        }
+      }
+    }
+  }
+
 }

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=757131&r1=757130&r2=757131&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
 Sun Mar 22 05:35:32 2009
@@ -28,6 +28,18 @@
   }
 
   @Test
+  public void shouldSelectListOfBlogsUsingXMLConfig() {
+    SqlSession session = sqlSessionFactory.openSession();
+    try {
+      BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);
+      List<Blog> blogs = mapper.selectBlogsFromXML();
+      assertEquals(2, blogs.size());
+    } finally {
+      session.close();
+    }
+  }
+
+  @Test
   public void shouldExecuteBoundSelectListOfBlogsStatementUsingProvider() {
     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=757131&r1=757130&r2=757131&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
 Sun Mar 22 05:35:32 2009
@@ -18,6 +18,10 @@
 
   //======================================================
 
+  List<Blog> selectBlogsFromXML();
+
+  //======================================================
+
   @Select({
       "SELECT *",
       "FROM blog"

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml?rev=757131&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/binding/BoundBlogMapper.xml
 Sun Mar 22 05:35:32 2009
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!DOCTYPE mapper
+    PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
+    "http://ibatis.apache.org/dtd/ibatis-mapper-3.dtd";>
+
+<mapper>
+
+  <select id="selectBlogsFromXML" resultType="domain.blog.Blog">
+      SELECT * FROM blog
+  </select>
+
+</mapper>
\ No newline at end of file

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java?rev=757131&r1=757130&r2=757131&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
 Sun Mar 22 05:35:32 2009
@@ -24,8 +24,6 @@
     final String resource = "org/apache/ibatis/parser/MapperConfig.xml";
     final Reader reader = Resources.getResourceAsReader(resource);
     sqlMapper = new SqlSessionFactoryBuilder().build(reader);
-    sqlMapper.getConfiguration().addMapper(AuthorMapper.class);
-    sqlMapper.getConfiguration().addMapper(BlogMapper.class);
   }
 
   @Test


Reply via email to