Skip to content
This repository was archived by the owner on Dec 15, 2018. It is now read-only.

Commit dedcc40

Browse files
committed
Added a dirty hack to work around Liberty/CXF issues
1 parent 2c75c6b commit dedcc40

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

core/src/main/java/org/mvcspec/ozark/core/ViewableWriter.java

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@
1515
*/
1616
package org.mvcspec.ozark.core;
1717

18+
import org.mvcspec.ozark.cdi.OzarkCdiExtension;
1819
import org.mvcspec.ozark.engine.ViewEngineContextImpl;
1920
import org.mvcspec.ozark.engine.ViewEngineFinder;
21+
import org.mvcspec.ozark.engine.Viewable;
2022
import org.mvcspec.ozark.event.AfterProcessViewEventImpl;
2123
import org.mvcspec.ozark.event.BeforeProcessViewEventImpl;
22-
import org.mvcspec.ozark.cdi.OzarkCdiExtension;
2324

2425
import javax.enterprise.event.Event;
2526
import javax.enterprise.inject.Instance;
2627
import javax.inject.Inject;
2728
import javax.mvc.Models;
2829
import javax.mvc.MvcContext;
29-
import org.mvcspec.ozark.engine.Viewable;
3030
import javax.mvc.engine.ViewEngine;
3131
import javax.mvc.engine.ViewEngineException;
3232
import javax.mvc.event.AfterProcessViewEvent;
@@ -52,6 +52,7 @@
5252
import java.io.OutputStreamWriter;
5353
import java.io.PrintWriter;
5454
import java.lang.annotation.Annotation;
55+
import java.lang.reflect.InvocationTargetException;
5556
import java.lang.reflect.Type;
5657
import java.nio.charset.Charset;
5758

@@ -81,10 +82,10 @@ public class ViewableWriter implements MessageBodyWriter<Viewable> {
8182
private Instance<Models> modelsInstance;
8283

8384
@Context
84-
private HttpServletRequest request;
85+
private HttpServletRequest injectedRequest;
8586

8687
@Context
87-
private HttpServletResponse response;
88+
private HttpServletResponse injectedResponse;
8889

8990
@Context
9091
private UriInfo uriInfo;
@@ -132,6 +133,10 @@ public void writeTo(Viewable viewable, Class<?> aClass, Type type, Annotation[]
132133
throw new ServerErrorException(messages.get("NoViewEngine", viewable), INTERNAL_SERVER_ERROR);
133134
}
134135

136+
// Special hack for WebSphere Liberty
137+
HttpServletRequest request = unwrap(injectedRequest, HttpServletRequest.class);
138+
HttpServletResponse response = unwrap(injectedResponse, HttpServletResponse.class);
139+
135140
// Create wrapper for response
136141
final ServletOutputStream responseStream = new DelegatingServletOutputStream(out);
137142
final PrintWriter responseWriter = new PrintWriter(new OutputStreamWriter(responseStream, getCharset(headers)));
@@ -174,6 +179,33 @@ public void writeTo(Viewable viewable, Class<?> aClass, Type type, Annotation[]
174179
}
175180
}
176181

182+
/**
183+
* This method is basically a dirty hack to get Ozark work on WebSphere Liberty.
184+
* The primary use case is to unwrap the original request/response from the wrapper we get
185+
* from CXF. This is required because the wrappers don't use the official wrapper base classes
186+
* and therefore Liberty fails to forward such requests because unwrapping isn't possible.
187+
*/
188+
private <T> T unwrap(T obj, Class<T> type) {
189+
190+
String implName = obj.getClass().getName();
191+
192+
if (implName.equals("org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletRequest")
193+
|| implName.equals("org.apache.cxf.jaxrs.impl.tl.ThreadLocalHttpServletResponse")) {
194+
195+
try {
196+
return type.cast(
197+
obj.getClass().getMethod("get").invoke(obj)
198+
);
199+
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
200+
throw new IllegalStateException("Failed to unwrap", e);
201+
}
202+
203+
}
204+
205+
return obj;
206+
207+
}
208+
177209
/**
178210
* Looks for a character set as part of the Content-Type header. Returns it
179211
* if specified or {@link #UTF8} if not.

core/src/test/java/org/mvcspec/ozark/core/ViewableWriterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void testWriteTo() throws Exception {
8383
finderField.set(writer, finder);
8484

8585
HttpServletRequest request = EasyMock.createStrictMock(HttpServletRequest.class);
86-
Field requestField = writer.getClass().getDeclaredField("request");
86+
Field requestField = writer.getClass().getDeclaredField("injectedRequest");
8787
requestField.setAccessible(true);
8888
requestField.set(writer, request);
8989

@@ -95,7 +95,7 @@ public void testWriteTo() throws Exception {
9595
ViewEngine viewEngine = EasyMock.createStrictMock(ViewEngine.class);
9696

9797
HttpServletResponse response = EasyMock.createStrictMock(HttpServletResponse.class);
98-
Field responseField = writer.getClass().getDeclaredField("response");
98+
Field responseField = writer.getClass().getDeclaredField("injectedResponse");
9999
responseField.setAccessible(true);
100100
responseField.set(writer, response);
101101

0 commit comments

Comments
 (0)