1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.ibatis.sqlmap.engine.mapping.statement;
17
18 import com.ibatis.sqlmap.client.event.RowHandler;
19 import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
20 import com.ibatis.sqlmap.engine.scope.StatementScope;
21 import com.ibatis.sqlmap.engine.type.XmlTypeMarker;
22
23 import java.io.StringWriter;
24 import java.sql.ResultSet;
25 import java.sql.SQLException;
26
27 import javax.xml.XMLConstants;
28 import javax.xml.transform.Transformer;
29 import javax.xml.transform.TransformerException;
30 import javax.xml.transform.TransformerFactory;
31 import javax.xml.transform.dom.DOMSource;
32 import javax.xml.transform.stream.StreamResult;
33
34 import org.w3c.dom.Document;
35
36
37
38
39 public class RowHandlerCallback {
40
41
42 private RowHandler rowHandler;
43
44
45 private ResultMap resultMap;
46
47
48 private Object resultObject;
49
50
51
52
53
54
55
56
57
58
59
60 public RowHandlerCallback(ResultMap resultMap, Object resultObject, RowHandler rowHandler) {
61 this.rowHandler = rowHandler;
62 this.resultMap = resultMap;
63 this.resultObject = resultObject;
64 }
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79 public void handleResultObject(StatementScope statementScope, Object[] results, ResultSet rs) throws SQLException {
80 Object object;
81
82 statementScope.setCurrentNestedKey(null);
83 object = resultMap.resolveSubMap(statementScope, rs).setResultObjectValues(statementScope, resultObject, results);
84
85 if (object != ResultMap.NO_VALUE) {
86
87 int stackDepth = statementScope.getSession().getRequestStackDepth();
88 if (stackDepth == 1) {
89 Class targetType = statementScope.getResultMap().getResultClass();
90 if (XmlTypeMarker.class.isAssignableFrom(targetType) && object instanceof Document) {
91 object = documentToString((Document) object);
92 }
93 }
94
95 rowHandler.handleRow(object);
96 }
97 }
98
99
100
101
102
103
104
105
106
107 private String documentToString(Document document) {
108 String s = null;
109
110 try {
111 TransformerFactory tFactory = TransformerFactory.newInstance();
112 tFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
113 tFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
114 Transformer transformer = tFactory.newTransformer();
115
116 DOMSource source = new DOMSource(document);
117 StringWriter writer = new StringWriter();
118 StreamResult result = new StreamResult(writer);
119 transformer.transform(source, result);
120 s = writer.getBuffer().toString();
121
122 } catch (TransformerException e) {
123 throw new RuntimeException("Error occurred. Cause: " + e, e);
124 }
125
126 return s;
127 }
128
129
130
131
132
133
134 public RowHandler getRowHandler() {
135 return rowHandler;
136 }
137
138 }