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/01/03 05:55:55 UTC

svn commit: r730909 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src: main/java/org/apache/ibatis/api/defaults/ main/java/org/apache/ibatis/api/exceptions/ main/java/org/apache/ibatis/executor/ main/java/org/apache/ibatis/executor/parameter/ main/jav...

Author: cbegin
Date: Fri Jan  2 20:55:55 2009
New Revision: 730909

URL: http://svn.apache.org/viewvc?rev=730909&view=rev
Log:
Refactored ErrorContext
Improved error messages in general
Added 1:M collections test

Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/exceptions/ExceptionFactory.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ErrorContext.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/BaseStatementHandler.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/MappedStatement.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigParser.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/api/SqlSessionTest.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ErrorContextTest.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/BlogMapper.xml

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/defaults/DefaultSqlSession.java Fri Jan  2 20:55:55 2009
@@ -9,7 +9,6 @@
 import org.apache.ibatis.mapping.Configuration;
 
 import java.util.List;
-import java.sql.SQLException;
 
 public class DefaultSqlSession implements SqlSession {
 
@@ -54,7 +53,7 @@
     try {
       MappedStatement ms = configuration.getMappedStatement(statement);
       return executor.query(ms, parameter, offset, limit, handler);
-    } catch (SQLException e) {
+    } catch (Exception e) {
       throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e);
     }
   }
@@ -78,7 +77,7 @@
       dirty = true;
       MappedStatement ms = configuration.getMappedStatement(statement);
       return executor.update(ms, parameter);
-    } catch (SQLException e) {
+    } catch (Exception e) {
       throw ExceptionFactory.wrapException("Error updating database.  Cause: " + e, e);
     }
   }
@@ -99,7 +98,7 @@
     try {
       executor.commit(isCommitOrRollbackRequired(force));
       dirty = false;
-    } catch (SQLException e) {
+    } catch (Exception e) {
       throw ExceptionFactory.wrapException("Error committing transaction.  Cause: " + e, e);
     }
   }
@@ -112,7 +111,7 @@
     try {
       executor.rollback(isCommitOrRollbackRequired(force));
       dirty = false;
-    } catch (SQLException e) {
+    } catch (Exception e) {
       throw ExceptionFactory.wrapException("Error rolling back transaction.  Cause: " + e, e);
     }
   }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/exceptions/ExceptionFactory.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/exceptions/ExceptionFactory.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/exceptions/ExceptionFactory.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/api/exceptions/ExceptionFactory.java Fri Jan  2 20:55:55 2009
@@ -1,11 +1,11 @@
 package org.apache.ibatis.api.exceptions;
 
-import java.sql.SQLException;
+import org.apache.ibatis.executor.ErrorContext;
 
 public class ExceptionFactory {
 
   public static RuntimeException wrapException(String message, Exception e) {
-    return new RuntimeSqlException(message, e);
+    return new RuntimeSqlException(ErrorContext.instance().message(message).cause(e).toString(), e);
   }
 
 }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/BaseExecutor.java Fri Jan  2 20:55:55 2009
@@ -3,7 +3,6 @@
 import org.apache.ibatis.cache.CacheKey;
 import org.apache.ibatis.cache.impl.PerpetualCache;
 import org.apache.ibatis.executor.result.ResultHandler;
-import org.apache.ibatis.logging.*;
 import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.type.TypeHandlerRegistry;
@@ -44,6 +43,7 @@
   }
 
   public int update(MappedStatement ms, Object parameter) throws SQLException {
+    ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId());
     localCache.clear();
     return doUpdate(ms, parameter);
   }
@@ -54,6 +54,7 @@
   }
 
   public List query(MappedStatement ms, Object parameter, int offset, int limit, ResultHandler resultHandler) throws SQLException {
+    ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
     List list;
     try {
       queryStack++;

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ErrorContext.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ErrorContext.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ErrorContext.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/ErrorContext.java Fri Jan  2 20:55:55 2009
@@ -2,125 +2,122 @@
 
 public class ErrorContext {
 
-  private static final ThreadLocal<ErrorContext> local = new ThreadLocal<ErrorContext>();
+  private static String NEWLINE; // Can't be final due to a weird Java compiler issue.
+  private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<ErrorContext>();
 
-  public static void set(String resource, String activity, String objectId, String moreInfo) {
-    _local()._set(resource,activity,objectId,moreInfo);
-  }
-
-  public static void set(String activity, String objectId, String moreInfo) {
-    _local()._set(activity,objectId,moreInfo);
-  }
-
-  public static void set(String objectId, String moreInfo) {
-    _local()._set(objectId,moreInfo);
-  }
-
-  public static void set(String moreInfo) {
-    _local()._set(moreInfo);
-  }
-
-  public static void set(Throwable cause) {
-    _local()._set(cause);
-  }
+  private String resource;
+  private String activity;
+  private String object;
+  private String message;
+  private String sql;
+  private Throwable cause;
 
-  public static String description() {
-    return _local()._toString();
+  static {
+    try {
+      NEWLINE = System.getProperty("line.separator");
+    } catch (Throwable t) {
+      NEWLINE = "\n";
+    }
   }
 
-  public static void reset() {
-    _local()._reset();
+  private ErrorContext() {
   }
 
-  private static ErrorContext _local() {
-    ErrorContext context = local.get();
+  public static ErrorContext instance() {
+    ErrorContext context = LOCAL.get();
     if (context == null) {
       context = new ErrorContext();
-      local.set(context);
+      LOCAL.set(context);
     }
     return context;
   }
 
-  private String resource;
-  private String activity;
-  private String objectId;
-  private String moreInfo;
-  private Throwable cause;
-
-  private ErrorContext() {
+  public ErrorContext resource(String resource) {
+    this.resource = resource;
+    return this;
   }
 
-  private void _set(String resource, String activity, String objectId, String moreInfo) {
-    this.resource = resource;
+  public ErrorContext activity(String activity) {
     this.activity = activity;
-    this.objectId = objectId;
-    this.moreInfo = moreInfo;
+    return this;
   }
 
-  private void _set(String activity, String objectId, String moreInfo) {
-    this.activity = activity;
-    this.objectId = objectId;
-    this.moreInfo = moreInfo;
+  public ErrorContext object(String object) {
+    this.object = object;
+    return this;
   }
 
-  private void _set(String objectId, String moreInfo) {
-    this.objectId = objectId;
-    this.moreInfo = moreInfo;
+  public ErrorContext message(String message) {
+    this.message = message;
+    return this;
   }
 
-  private void _set(String moreInfo) {
-    this.moreInfo = moreInfo;
+  public ErrorContext sql(String sql) {
+    this.sql = sql;
+    return this;
   }
 
-  private void _set(Throwable cause) {
+  public ErrorContext cause(Throwable cause) {
     this.cause = cause;
+    return this;
+  }
+
+  public ErrorContext reset() {
+    resource = null;
+    activity = null;
+    object = null;
+    message = null;
+    sql = null;
+    cause = null;
+    return this;
   }
 
-  private String _toString() {
-    StringBuffer message = new StringBuffer();
+  public String toString() {
+    StringBuffer description = new StringBuffer();
+
+    // message
+    if (this.message != null) {
+      description.append(NEWLINE);
+      description.append("### ");
+      description.append(this.message);
+    }
 
     // resource
     if (resource != null) {
-      message.append("  \n*** The error occurred in ");
-      message.append(resource);
-      message.append(".");
+      description.append(NEWLINE);
+      description.append("### The error may exist in ");
+      description.append(resource);
     }
 
-    // activity
-    if (activity != null) {
-      message.append("  \n*** The error occurred while ");
-      message.append(activity);
-      message.append(".");
+    // object
+    if (object != null) {
+      description.append(NEWLINE);
+      description.append("### The error may involve ");
+      description.append(object);
     }
 
-    // object
-    if (objectId != null) {
-      message.append("  \n*** Check ");
-      message.append(objectId);
-      message.append(".");
+    // activity
+    if (activity != null) {
+      description.append(NEWLINE);
+      description.append("### The error occurred while ");
+      description.append(activity);
     }
 
-    // more info
-    if (moreInfo != null) {
-      message.append("  \n*** ");
-      message.append(moreInfo);
+    // activity
+    if (sql != null) {
+      description.append(NEWLINE);
+      description.append("### SQL: ");
+      description.append(sql.replace('\n',' ').replace('\r',' ').replace('\t',' ').trim());
     }
 
     // cause
     if (cause != null) {
-      message.append("  \n*** Cause: ");
-      message.append(cause.toString());
+      description.append(NEWLINE);
+      description.append("### Cause: ");
+      description.append(cause.toString());
     }
 
-    return message.toString();
-  }
-
-  private void _reset() {
-    resource = null;
-    activity = null;
-    objectId = null;
-    moreInfo = null;
-    cause = null;
+    return description.toString();
   }
 
 }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/parameter/DefaultParameterHandler.java Fri Jan  2 20:55:55 2009
@@ -3,7 +3,7 @@
 import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.type.*;
-import org.apache.ibatis.executor.ExecutorException;
+import org.apache.ibatis.executor.*;
 
 import java.sql.*;
 import java.util.List;
@@ -27,6 +27,7 @@
 
   public void setParameters(PreparedStatement ps)
       throws SQLException {
+    ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
     List<ParameterMapping> parameterMappings = mappedStatement.getDynamicParameterMappings(parameterObject);
     if (parameterMappings != null) {
       MetaObject metaObject = parameterObject == null ? null : MetaObject.forObject(parameterObject);

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java Fri Jan  2 20:55:55 2009
@@ -1,8 +1,7 @@
 package org.apache.ibatis.executor.resultset;
 
 import org.apache.ibatis.cache.CacheKey;
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.executor.ExecutorException;
+import org.apache.ibatis.executor.*;
 import org.apache.ibatis.executor.loader.*;
 import org.apache.ibatis.executor.parameter.ParameterHandler;
 import org.apache.ibatis.executor.result.*;
@@ -54,6 +53,7 @@
       try {
         for (int i = 0, n = mappedStatement.getResultMaps().size(); i < n; i++) {
           ResultMap resultMap = mappedStatement.getResultMaps().get(i);
+          ErrorContext.instance().activity("handling result set").object(resultMap.getId());
           if (resultHandler == null) {
             DefaultResultHandler defaultResultHandler = new DefaultResultHandler();
             handleResults(rs, resultMap, defaultResultHandler, rowOffset, rowLimit);
@@ -80,7 +80,7 @@
   }
 
   public void handleOutputParameters(CallableStatement callableStatement) throws SQLException {
-    ParameterMap parameterMap = mappedStatement.getParameterMap();
+    ErrorContext.instance().activity("handling output parameters");
     MetaObject metaParam = MetaObject.forObject(parameterObject);
     List<ParameterMapping> parameterMappings = mappedStatement.getDynamicParameterMappings(parameterObject);
     for (int i = 0; i < parameterMappings.size(); i++) {

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/BaseStatementHandler.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/BaseStatementHandler.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/BaseStatementHandler.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/BaseStatementHandler.java Fri Jan  2 20:55:55 2009
@@ -50,6 +50,7 @@
 
   public Statement prepare(Connection connection)
       throws SQLException {
+    ErrorContext.instance().sql(sql);
     Statement statement = null;
     try {
       statement = instantiateStatement(connection);

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/MappedStatement.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/MappedStatement.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/MappedStatement.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/mapping/MappedStatement.java Fri Jan  2 20:55:55 2009
@@ -6,6 +6,7 @@
 
 public class MappedStatement {
 
+  private String resource;
   private Configuration configuration;
   private String id;
   private Integer fetchSize;
@@ -35,6 +36,11 @@
       mappedStatement.timeout = configuration.getDefaultStatementTimeout();
     }
 
+    public Builder resource(String resource) {
+      mappedStatement.resource = resource;
+      return this;
+    }
+
     public String id() {
       return mappedStatement.id;
     }
@@ -94,6 +100,10 @@
 
   }
 
+  public String getResource() {
+    return resource;
+  }
+
   public Configuration getConfiguration() {
     return configuration;
   }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigParser.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigParser.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigParser.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/MapperConfigParser.java Fri Jan  2 20:55:55 2009
@@ -9,6 +9,7 @@
 import org.apache.ibatis.mapping.Environment;
 import org.apache.ibatis.datasource.DataSourceFactory;
 import org.apache.ibatis.transaction.TransactionFactory;
+import org.apache.ibatis.executor.ErrorContext;
 
 import java.io.Reader;
 import java.util.*;
@@ -32,6 +33,7 @@
   }
 
   public MapperConfigParser(Reader reader, String environment, Properties props) {
+    ErrorContext.instance().resource("SQL Mapper Configuration");
     this.parsed = false;
     this.reader = reader;
     this.environment = environment;
@@ -214,14 +216,18 @@
     String url = context.getStringAttribute("url");
     Reader reader;
     if (resource != null && url == null) {
+      ErrorContext.instance().resource(resource);
       reader = Resources.getResourceAsReader(resource);
+      MapperParser mapperParser = new MapperParser(reader, configuration, resource);
+      mapperParser.parse();
     } else if (url != null && resource == null) {
+      ErrorContext.instance().resource(url);
       reader = Resources.getUrlAsReader(url);
+      MapperParser mapperParser = new MapperParser(reader, configuration, url);
+      mapperParser.parse();
     } else {
       throw new ParserException("A mapper element may only specify a url or resource, but not both.");
     }
-    MapperParser mapperParser = new MapperParser(reader, configuration);
-    mapperParser.parse();
   }
 
   private boolean isSpecifiedEnvironment() {

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=730909&r1=730908&r2=730909&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 Fri Jan  2 20:55:55 2009
@@ -5,6 +5,7 @@
 import org.apache.ibatis.type.*;
 import org.apache.ibatis.xml.*;
 import org.apache.ibatis.cache.Cache;
+import org.apache.ibatis.executor.ErrorContext;
 
 import java.io.Reader;
 import java.util.*;
@@ -15,6 +16,8 @@
   protected Reader reader;
   protected NodeletParser parser;
 
+  private String resource;
+
   private ParameterMap.Builder parameterMapBuilder;
   private List<ParameterMapping> parameterMappings;
 
@@ -26,7 +29,9 @@
 
   private Cache cache;
 
-  public MapperParser(Reader reader, Configuration configuration) {
+  public MapperParser(Reader reader, Configuration configuration, String resource) {
+    ErrorContext.instance().resource(resource);
+    this.resource = resource;
     this.reader = reader;
 
     this.configuration = configuration;
@@ -283,10 +288,11 @@
     String id = context.getStringAttribute("id");
     id = applyNamespace(id);
 
-    String sql = context.getStringBody();
+    //String sql = context.getStringBody();
     SqlSource sqlSource = new SqlSourceParser(configuration).parse(context);
 
     MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, id, sqlSource);
+    statementBuilder.resource(resource);
     Integer fetchSize = context.getIntAttribute("fetchSize", null);
     statementBuilder.fetchSize(fetchSize);
     statementBuilder.statementType(statementType);
@@ -384,8 +390,8 @@
 
     ResultMapping.Builder builder = new ResultMapping.Builder(configuration, property, column, javaTypeClass);
     builder.jdbcType(jdbcTypeEnum);
-    builder.nestedQueryId(nestedSelect);
-    builder.nestedResultMapId(nestedResultMap);
+    builder.nestedQueryId(applyNamespace(nestedSelect));
+    builder.nestedResultMapId(applyNamespace(nestedResultMap));
     builder.typeHandler(typeHandlerInstance);
 
     return builder;

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/api/SqlSessionTest.java Fri Jan  2 20:55:55 2009
@@ -161,13 +161,14 @@
     }
   }
 
-  @Test @Ignore
+  @Test
   public void shouldSelectBlogWithPostsUsingSubSelect() throws Exception {
     SqlSession session = sqlMapper.openSession();
     try {
       Blog blog = (Blog) session.selectOne("com.domain.BlogMapper.selectBlogWithPostsUsingSubSelect", 1);
-
-      System.out.println(blog.getTitle());
+      Assert.assertEquals("Jim Business", blog.getTitle());
+      Assert.assertEquals(2, blog.getPosts().size());
+      Assert.assertEquals("Corn nuts",blog.getPosts().get(0).getSubject());
     } finally {
       session.close();
     }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ErrorContextTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ErrorContextTest.java?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ErrorContextTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/executor/ErrorContextTest.java Fri Jan  2 20:55:55 2009
@@ -6,25 +6,26 @@
 
   @Test
   public void shouldShowProgressiveErrorContextBuilding() {
-    ErrorContext.set("somefile.xml", "some activity", "some object", "Here's more info.");
-    ErrorContext.description().startsWith("*** The error occurred in somefile.xml.");
-    ErrorContext.reset();
-
-    ErrorContext.set("some activity", "some object", "Here's more info.");
-    ErrorContext.description().startsWith("*** The error occurred while some activity.");
-    ErrorContext.reset();
-
-    ErrorContext.set("some object", "Here's more info.");
-    ErrorContext.description().startsWith("*** Check some object.");
-    ErrorContext.reset();
-
-    ErrorContext.set("Here's more info.");
-    ErrorContext.description().startsWith("*** Here's more info.");
-    ErrorContext.reset();
-
-    ErrorContext.set(new Exception("test"));
-    ErrorContext.description().startsWith("*** Cause: java.lang.Exception: test");
-    ErrorContext.reset();
+    ErrorContext context = ErrorContext.instance();
+    context.resource("somefile.xml").activity("some activity").object("some object").message("Here's more info.");
+    context.toString().startsWith("### The error occurred in somefile.xml.");
+    context.reset();
+
+    context.activity("some activity").object("some object").message("Here's more info.");
+    context.toString().startsWith("### The error occurred while some activity.");
+    context.reset();
+
+    context.object("some object").message("Here's more info.");
+    context.toString().startsWith("### Check some object.");
+    context.reset();
+
+    context.message("Here's more info.");
+    context.toString().startsWith("### Here's more info.");
+    context.reset();
+
+    context.cause(new Exception("test"));
+    context.toString().startsWith("### Cause: java.lang.Exception: test");
+    context.reset();
 
   }
 

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/BlogMapper.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/BlogMapper.xml?rev=730909&r1=730908&r2=730909&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/BlogMapper.xml (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/BlogMapper.xml Fri Jan  2 20:55:55 2009
@@ -9,15 +9,15 @@
   <resultMap id="blogWithPosts" type="Blog">
     <id property="id" column="id" />
     <result property="title" column="title" />
-    <collection property="posts" column="id" javaType="Post" select="selectPostsForBlog" />
+    <collection property="posts" column="id" select="selectPostsForBlog" />
   </resultMap>
 
   <select id="selectBlogWithPostsUsingSubSelect" parameterType="int" resultMap="blogWithPosts">
-    select * from Blog where id = ${id}
+    select * from Blog where id = #{id}
   </select>
   
   <select id="selectPostsForBlog" parameterType="int" resultType="Post" >
-    select * from Post where blog_id = ${blog_id}
+    select * from Post where blog_id = #{blog_id}
   </select>
 
 </mapper>
\ No newline at end of file