Skip to content

Commit 139e297

Browse files
committed
#1146 cache XSL factories
1 parent 3789ae3 commit 139e297

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed

src/main/java/org/takes/rs/RsWithHeader.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.regex.Pattern;
2727
import lombok.EqualsAndHashCode;
2828
import lombok.ToString;
29+
import org.cactoos.Scalar;
2930
import org.cactoos.iterable.IterableOf;
3031
import org.cactoos.iterable.Joined;
3132
import org.takes.Response;
@@ -99,9 +100,18 @@ public RsWithHeader(final Response res, final CharSequence name,
99100
* @param header Header to add
100101
*/
101102
public RsWithHeader(final Response res, final CharSequence header) {
103+
this(res, () -> header);
104+
}
105+
106+
/**
107+
* Ctor.
108+
* @param res Original response
109+
* @param header Header to add
110+
*/
111+
public RsWithHeader(final Response res, final Scalar<CharSequence> header) {
102112
super(
103113
new ResponseOf(
104-
() -> RsWithHeader.extend(res.head(), header.toString()),
114+
() -> RsWithHeader.extend(res.head(), header.value().toString()),
105115
res::body
106116
)
107117
);

src/main/java/org/takes/rs/RsXslt.java

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import java.io.IOException;
2828
import java.io.InputStream;
2929
import java.net.URI;
30+
import java.util.Map;
31+
import java.util.concurrent.ConcurrentHashMap;
3032
import javax.xml.transform.Source;
3133
import javax.xml.transform.Transformer;
3234
import javax.xml.transform.TransformerConfigurationException;
@@ -84,6 +86,12 @@
8486
@EqualsAndHashCode(callSuper = true)
8587
public final class RsXslt extends RsWrap {
8688

89+
/**
90+
* Cached factory.
91+
*/
92+
private static final Map<URIResolver, TransformerFactory> FACTORIES =
93+
new ConcurrentHashMap<>(0);
94+
8795
/**
8896
* Ctor.
8997
* @param rsp Original response
@@ -99,13 +107,35 @@ public RsXslt(final Response rsp) {
99107
*/
100108
public RsXslt(final Response rsp, final URIResolver resolver) {
101109
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+
)
105119
)
106120
);
107121
}
108122

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+
109139
/**
110140
* Build body.
111141
* @param origin Original body
@@ -115,12 +145,17 @@ public RsXslt(final Response rsp, final URIResolver resolver) {
115145
*/
116146
private static InputStream transform(final InputStream origin,
117147
final URIResolver resolver) throws IOException {
148+
final TransformerFactory fct = RsXslt.factory(resolver);
118149
try {
119-
final TransformerFactory factory = TransformerFactory.newInstance();
120-
factory.setURIResolver(resolver);
121-
return RsXslt.transform(factory, origin);
150+
return RsXslt.transform(fct, origin);
122151
} 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+
);
124159
}
125160
}
126161

0 commit comments

Comments
 (0)