Skip to content

Commit 7593341

Browse files
committed
Add RPC logging facade backed by service loader
1 parent 1972cb5 commit 7593341

17 files changed

Lines changed: 497 additions & 60 deletions

maven/lib-gwt.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ function maven-gwt() {
8686
zip -q $GWT_EXTRACT_DIR/gwt-user.jar --copy --out $GWT_EXTRACT_DIR/gwt-user-trimmed.jar \
8787
"com/google/gwt/*" "com/google/web/bindery/*" "javaemul/*" \
8888
"javax/validation/*" "org/hibernate/validator/*" \
89-
"org/w3c/flute/*"
89+
"org/w3c/flute/*" "META-INF/services/*"
9090
mv $GWT_EXTRACT_DIR/gwt-user-trimmed.jar $GWT_EXTRACT_DIR/gwt-user.jar
9191

9292
for i in $gwtLibs

user/build.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,24 @@
163163
</tokenfilter>
164164
</filterchain>
165165
</move>
166+
<move file="${project.build}/no-servlet-src/META-INF/services/com.google.gwt.user.server.rpc.logging.LoggerProvider" tofile="${project.build}/jakarta-src/META-INF/services/com.google.gwt.user.server.rpc.logging.jakarta.LoggerProvider">
167+
<filterchain>
168+
<tokenfilter>
169+
<replacestring from="com.google.gwt.user.server.rpc.logging" to="com.google.gwt.user.server.rpc.logging.jakarta"/>
170+
</tokenfilter>
171+
</filterchain>
172+
</move>
173+
<move todir="${project.build}/jakarta-src/com/google/gwt/user/server/rpc/logging/jakarta">
174+
<fileset dir="${project.build}/no-servlet-src/com/google/gwt/user/server/rpc/logging">
175+
<include name="**/*.java"/>
176+
</fileset>
177+
<filterchain>
178+
<tokenfilter>
179+
<replacestring from="package com.google.gwt.user.server.rpc.logging" to="package com.google.gwt.user.server.rpc.logging.jakarta"/>
180+
<replacestring from="javax.servlet" to="jakarta.servlet"/>
181+
</tokenfilter>
182+
</filterchain>
183+
</move>
166184
<move todir="${project.build}/jakarta-src/com/google/gwt/user/server/rpc/jakarta">
167185
<filelist dir="${project.build}/no-servlet-src/com/google/gwt/user/server/rpc">
168186
<file name="AbstractRemoteServiceServlet.java"/>
@@ -178,6 +196,7 @@
178196
<tokenfilter>
179197
<replacestring from="package com.google.gwt.user.server.rpc" to="package com.google.gwt.user.server.rpc.jakarta"/>
180198
<replacestring from="com.google.gwt.user.server.Util" to="com.google.gwt.user.server.jakarta.Util"/>
199+
<replacestring from="com.google.gwt.user.server.rpc.logging" to="com.google.gwt.user.server.rpc.logging.jakarta"/>
181200
<replacestring from="javax.servlet" to="jakarta.servlet"/>
182201
</tokenfilter>
183202
</filterchain>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
com.google.gwt.user.server.rpc.logging.JulLoggerProvider
2+
com.google.gwt.user.server.rpc.logging.Log4jProvider
3+
com.google.gwt.user.server.rpc.logging.PlatformLoggerProvider
4+
# No no-args constructor: com.google.gwt.user.server.rpc.logging.ServletContextLoggerProvider

user/src/com/google/gwt/user/server/rpc/RPCServletUtils.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
package com.google.gwt.user.server.rpc;
1717

1818

19+
import com.google.gwt.user.server.rpc.logging.LogManager;
20+
import com.google.gwt.user.server.rpc.logging.Logger;
21+
1922
import java.io.ByteArrayOutputStream;
2023
import java.io.IOException;
2124
import java.io.InputStream;
@@ -24,8 +27,6 @@
2427
import java.nio.charset.StandardCharsets;
2528
import java.util.Locale;
2629
import java.util.concurrent.ConcurrentHashMap;
27-
import java.util.logging.Level;
28-
import java.util.logging.Logger;
2930
import java.util.zip.GZIPOutputStream;
3031

3132
import javax.servlet.ServletContext;
@@ -39,7 +40,7 @@
3940
*/
4041
public class RPCServletUtils {
4142

42-
private static final Logger logger = Logger.getLogger(RPCServletUtils.class.getName());
43+
private static final Logger logger = LogManager.getLogger(RPCServletUtils.class);
4344

4445
public static final String CHARSET_UTF8_NAME = "UTF-8";
4546

@@ -374,7 +375,7 @@ public static void writeResponse(
374375
}
375376

376377
if (caught != null) {
377-
logger.log(Level.SEVERE, "Unable to compress response", caught);
378+
logger.error("Unable to compress response", caught);
378379
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
379380
return;
380381
}
@@ -405,7 +406,7 @@ public static void writeResponseForUnexpectedFailure(
405406
*/
406407
public static void writeResponseForUnexpectedFailure(
407408
HttpServletResponse response, Throwable failure) {
408-
logger.log(Level.SEVERE, "Exception while dispatching incoming RPC call", failure);
409+
logger.error("Exception while dispatching incoming RPC call", failure);
409410

410411
// Send GENERIC_FAILURE_MSG with 500 status.
411412
//
@@ -419,7 +420,7 @@ public static void writeResponseForUnexpectedFailure(
419420
response.getWriter().write(GENERIC_FAILURE_MSG);
420421
}
421422
} catch (IOException ex) {
422-
logger.log(Level.SEVERE,
423+
logger.error(
423424
"respondWithUnexpectedFailure failed while sending the previous failure to the client",
424425
ex);
425426
}

user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException;
2323
import com.google.gwt.user.client.rpc.RpcTokenException;
2424
import com.google.gwt.user.client.rpc.SerializationException;
25+
import com.google.gwt.user.server.rpc.logging.LogManager;
26+
import com.google.gwt.user.server.rpc.logging.Logger;
2527

2628
import java.io.IOException;
2729
import java.io.InputStream;
@@ -30,8 +32,6 @@
3032
import java.text.ParseException;
3133
import java.util.HashMap;
3234
import java.util.Map;
33-
import java.util.logging.Level;
34-
import java.util.logging.Logger;
3535

3636
import javax.servlet.ServletConfig;
3737
import javax.servlet.ServletException;
@@ -47,7 +47,7 @@
4747
public class RemoteServiceServlet extends AbstractRemoteServiceServlet
4848
implements SerializationPolicyProvider {
4949

50-
private static final Logger logger = Logger.getLogger(RemoteServiceServlet.class.getName());
50+
private static final Logger logger = LogManager.getLogger(RemoteServiceServlet.class);
5151

5252
/**
5353
* Loads a serialization policy stored as a servlet resource in the same
@@ -66,7 +66,7 @@ static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
6666
modulePath = new URL(moduleBaseURL).getPath();
6767
} catch (MalformedURLException ex) {
6868
// log the information, we will default
69-
logger.log(Level.SEVERE, "Malformed moduleBaseURL: " + moduleBaseURL, ex);
69+
logger.error("Malformed moduleBaseURL: " + moduleBaseURL, ex);
7070
}
7171
}
7272

@@ -83,7 +83,7 @@ static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
8383
+ ", is not in the same web application as this servlet, "
8484
+ contextPath
8585
+ ". Your module may not be properly configured or your client and server code maybe out of date.";
86-
logger.log(Level.SEVERE, message);
86+
logger.error(message);
8787
} else {
8888
// Strip off the context path from the module base URL. It should be a
8989
// strict prefix.
@@ -102,12 +102,12 @@ static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
102102
null);
103103
if (serializationPolicy.hasClientFields()) {
104104
if (ENABLE_ENHANCED_CLASSES) {
105-
logger.log(Level.WARNING,
105+
logger.warn(
106106
"Service deserializes enhanced JPA/JDO classes, which is " +
107107
"unsafe. See https://github.com/gwtproject/gwt/issues/9709 for more " +
108108
"detail on the vulnerability that this presents.");
109109
} else {
110-
logger.log(Level.SEVERE,
110+
logger.error(
111111
"Service deserializes enhanced JPA/JDO classes, which is " +
112112
"unsafe. Review build logs to see which classes are affected, or set " +
113113
ENABLE_GWT_ENHANCED_CLASSES_PROPERTY + " to true to allow using this " +
@@ -117,19 +117,19 @@ static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
117117
}
118118
}
119119
} catch (ParseException e) {
120-
logger.log(Level.SEVERE,
120+
logger.error(
121121
"Failed to parse the policy file '"
122122
+ serializationPolicyFilePath + "'", e);
123123
} catch (IOException e) {
124-
logger.log(Level.SEVERE,
124+
logger.error(
125125
"Could not read the policy file '"
126126
+ serializationPolicyFilePath + "'", e);
127127
}
128128
} else {
129129
String message = "The serialization policy file '"
130130
+ serializationPolicyFilePath
131131
+ "' was not found; did you forget to include it in this deployment?";
132-
logger.log(Level.SEVERE, message);
132+
logger.error(message);
133133
}
134134
} finally {
135135
if (is != null) {
@@ -190,9 +190,22 @@ public RemoteServiceServlet(Object delegate) {
190190
@Override
191191
public void init(ServletConfig config) throws ServletException {
192192
super.init(config);
193+
String providerName = getProviderName(config);
194+
LogManager.initialize(providerName, config.getServletContext());
193195
codeServerPort = getCodeServerPort();
194196
}
195197

198+
private String getProviderName(ServletConfig config) {
199+
String parameterName = "gwt.rpc.logging";
200+
if (System.getProperty(parameterName) != null) {
201+
return System.getProperty(parameterName);
202+
} else if (config.getInitParameter(parameterName) != null) {
203+
return config.getInitParameter(parameterName);
204+
} else {
205+
return config.getServletContext().getInitParameter(parameterName);
206+
}
207+
}
208+
196209
/**
197210
* Returns the value of the gwt.codeserver.port system property, or zero if not defined.
198211
*
@@ -268,7 +281,7 @@ public final SerializationPolicy getSerializationPolicy(String moduleBaseURL,
268281

269282
if (serializationPolicy == null) {
270283
// Failed to get the requested serialization policy; use the default
271-
logger.log(Level.WARNING,
284+
logger.warn(
272285
"Failed to get the SerializationPolicy '"
273286
+ strongName
274287
+ "' for module '"
@@ -319,8 +332,7 @@ public String processCall(String payload) throws SerializationException {
319332
try {
320333
rpcRequest = RPC.decodeRequest(payload, delegate.getClass(), this);
321334
} catch (IncompatibleRemoteServiceException ex) {
322-
logger.log(
323-
Level.SEVERE,
335+
logger.error(
324336
"An IncompatibleRemoteServiceException was thrown while processing this call.",
325337
ex);
326338
return RPC.encodeResponseForFailedRequest(null, ex);
@@ -359,12 +371,12 @@ public String processCall(RPCRequest rpcRequest) throws SerializationException {
359371
rpcRequest.getParameters(), rpcRequest.getSerializationPolicy(),
360372
rpcRequest.getFlags());
361373
} catch (IncompatibleRemoteServiceException ex) {
362-
logger.log(Level.SEVERE,
374+
logger.error(
363375
"An IncompatibleRemoteServiceException was thrown while processing this call.",
364376
ex);
365377
return RPC.encodeResponseForFailedRequest(rpcRequest, ex);
366378
} catch (RpcTokenException tokenException) {
367-
logger.log(Level.SEVERE,
379+
logger.error(
368380
"An RpcTokenException was thrown while processing this call.",
369381
tokenException);
370382
return RPC.encodeResponseForFailedRequest(rpcRequest, tokenException);
@@ -474,19 +486,7 @@ protected String getCodeServerPolicyUrl(String strongName) {
474486
* no authentication. It should only be used during development.</p>
475487
*/
476488
protected SerializationPolicy loadPolicyFromCodeServer(String url) {
477-
SerializationPolicyClient.Logger adapter = new SerializationPolicyClient.Logger() {
478-
479-
@Override
480-
public void logInfo(String message) {
481-
logger.log(Level.INFO, message);
482-
}
483-
484-
@Override
485-
public void logError(String message, Throwable throwable) {
486-
logger.log(Level.SEVERE, message, throwable);
487-
}
488-
};
489-
return CODE_SERVER_CLIENT.loadPolicy(url, adapter);
489+
return CODE_SERVER_CLIENT.loadPolicy(url);
490490
}
491491

492492
/**

user/src/com/google/gwt/user/server/rpc/SerializationPolicyClient.java

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package com.google.gwt.user.server.rpc;
1717

18+
import com.google.gwt.user.server.rpc.logging.LogManager;
19+
import com.google.gwt.user.server.rpc.logging.Logger;
20+
1821
import java.io.IOException;
1922
import java.io.InputStream;
2023
import java.net.HttpURLConnection;
@@ -30,6 +33,8 @@
3033
* (Intended only for development.)
3134
*/
3235
class SerializationPolicyClient {
36+
37+
private static final Logger logger = LogManager.getLogger(SerializationPolicyClient.class);
3338
private final int connectTimeout;
3439
private final int readTimeout;
3540

@@ -43,12 +48,12 @@ class SerializationPolicyClient {
4348
this.readTimeout = readTimeoutMs;
4449
}
4550

46-
SerializationPolicy loadPolicy(String url, Logger logger) {
51+
SerializationPolicy loadPolicy(String url) {
4752
URL urlObj;
4853
try {
4954
urlObj = new URL(url);
5055
} catch (MalformedURLException e) {
51-
logger.logError("Can't parse serialization policy URL: " + url, e);
56+
logger.error("Can't parse serialization policy URL: " + url, e);
5257
return null;
5358
}
5459

@@ -66,11 +71,11 @@ SerializationPolicy loadPolicy(String url, Logger logger) {
6671
conn.connect();
6772
in = conn.getInputStream();
6873
} catch (IOException e) {
69-
logger.logError("Can't open serialization policy URL: " + url, e);
74+
logger.error("Can't open serialization policy URL: " + url, e);
7075
return null;
7176
}
7277

73-
return readPolicy(in, url, logger);
78+
return readPolicy(in, url);
7479
}
7580

7681
/**
@@ -79,34 +84,33 @@ SerializationPolicy loadPolicy(String url, Logger logger) {
7984
* @param sourceName names the source of the input stream for log messages.
8085
* @return the policy or null if unavailable.
8186
*/
82-
private static SerializationPolicy readPolicy(InputStream in, String sourceName,
83-
Logger logger) {
87+
private static SerializationPolicy readPolicy(InputStream in, String sourceName) {
8488
try {
8589
List<ClassNotFoundException> errs = new ArrayList<ClassNotFoundException>();
8690
SerializationPolicy policy = SerializationPolicyLoader.loadFromStream(in, errs);
87-
logger.logInfo("Downloaded serialization policy from " + sourceName);
91+
logger.error("Downloaded serialization policy from " + sourceName);
8892

8993
if (!errs.isEmpty()) {
90-
logMissingClasses(logger, errs);
94+
logMissingClasses(errs);
9195
}
9296
return policy;
9397

9498
} catch (ParseException e) {
95-
logger.logError("Can't parse serialization policy from " + sourceName, e);
99+
logger.error("Can't parse serialization policy from " + sourceName, e);
96100
return null;
97101
} catch (IOException e) {
98-
logger.logError("Can't read serialization policy from " + sourceName, e);
102+
logger.error("Can't read serialization policy from " + sourceName, e);
99103
return null;
100104
} finally {
101105
try {
102106
in.close();
103107
} catch (IOException e) {
104-
logger.logError("Can't close serialization policy url: " + sourceName, e);
108+
logger.error("Can't close serialization policy url: " + sourceName, e);
105109
}
106110
}
107111
}
108112

109-
private static void logMissingClasses(Logger logger, List<ClassNotFoundException> errs) {
113+
private static void logMissingClasses(List<ClassNotFoundException> errs) {
110114
StringBuilder message = new StringBuilder();
111115
message.append("Unable to load server-side classes used by policy:\n");
112116

@@ -118,14 +122,7 @@ private static void logMissingClasses(Logger logger, List<ClassNotFoundException
118122
if (omitted > 0) {
119123
message.append(" (omitted " + omitted + " more classes)\n");
120124
}
121-
logger.logInfo(message.toString());
125+
logger.info(message.toString());
122126
}
123127

124-
/**
125-
* Destination for the loader's log messages.
126-
*/
127-
interface Logger {
128-
void logInfo(String message);
129-
void logError(String message, Throwable throwable);
130-
}
131128
}

0 commit comments

Comments
 (0)