27
27
import java .io .IOException ;
28
28
import java .io .InputStream ;
29
29
import java .net .URI ;
30
+ import java .util .Map ;
31
+ import java .util .concurrent .ConcurrentHashMap ;
30
32
import javax .xml .transform .Source ;
31
33
import javax .xml .transform .Transformer ;
32
34
import javax .xml .transform .TransformerConfigurationException ;
84
86
@ EqualsAndHashCode (callSuper = true )
85
87
public final class RsXslt extends RsWrap {
86
88
89
+ /**
90
+ * Cached factory.
91
+ */
92
+ private static final Map <URIResolver , TransformerFactory > FACTORIES =
93
+ new ConcurrentHashMap <>(0 );
94
+
87
95
/**
88
96
* Ctor.
89
97
* @param rsp Original response
@@ -99,13 +107,35 @@ public RsXslt(final Response rsp) {
99
107
*/
100
108
public RsXslt (final Response rsp , final URIResolver resolver ) {
101
109
super (
102
- new ResponseOf (
103
- rsp ::head ,
104
- () -> RsXslt .transform (rsp .body (), resolver )
110
+ new RsWithHeader (
111
+ new ResponseOf (
112
+ rsp ::head ,
113
+ () -> RsXslt .transform (rsp .body (), resolver )
114
+ ),
115
+ () -> String .format (
116
+ "X-Takes-RsXslt-TransformerFactory: %s" ,
117
+ RsXslt .factory (resolver ).getClass ().getCanonicalName ()
118
+ )
105
119
)
106
120
);
107
121
}
108
122
123
+ /**
124
+ * Get factory for the given resolver.
125
+ * @param resolver Resolver
126
+ * @return Factory
127
+ */
128
+ private static TransformerFactory factory (final URIResolver resolver ) {
129
+ return RsXslt .FACTORIES .computeIfAbsent (
130
+ resolver ,
131
+ res -> {
132
+ final TransformerFactory fct = TransformerFactory .newInstance ();
133
+ fct .setURIResolver (res );
134
+ return fct ;
135
+ }
136
+ );
137
+ }
138
+
109
139
/**
110
140
* Build body.
111
141
* @param origin Original body
@@ -115,12 +145,17 @@ public RsXslt(final Response rsp, final URIResolver resolver) {
115
145
*/
116
146
private static InputStream transform (final InputStream origin ,
117
147
final URIResolver resolver ) throws IOException {
148
+ final TransformerFactory fct = RsXslt .factory (resolver );
118
149
try {
119
- final TransformerFactory factory = TransformerFactory .newInstance ();
120
- factory .setURIResolver (resolver );
121
- return RsXslt .transform (factory , origin );
150
+ return RsXslt .transform (fct , origin );
122
151
} catch (final TransformerException ex ) {
123
- throw new IOException (ex );
152
+ throw new IOException (
153
+ String .format (
154
+ "Can't transform via %s" ,
155
+ fct .getClass ().getName ()
156
+ ),
157
+ ex
158
+ );
124
159
}
125
160
}
126
161
0 commit comments