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