package compositions; import com.fasterxml.jackson.databind.JsonNode; import play.libs.F; import play.mvc.Action; import play.mvc.Http; import play.mvc.Result; import play.mvc.With; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.Arrays; import java.util.List; import java.util.Map; public class RequestLoggingComposition { private static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(RequestLoggingComposition.class); @With(RequestLoggingAction.class) @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface RequestLogging { String value() default "*"; } public static class RequestLoggingAction extends Action<RequestLogging> { public F.Promise<Result> call(Http.Context context) throws Throwable { Http.Request request = context.request(); StringBuilder sb = new StringBuilder(request.method()); sb.append(" ") .append(request.uri()).append(" ") .append(request.queryString()).append(" "); Http.RequestBody body = request.body(); if (body.asText() != null) { String text = body.asText(); sb.append(text).append(" "); } if (body.asJson() != null) { JsonNode json = body.asJson(); sb.append(json.toString()).append(" "); } if (body.asFormUrlEncoded() != null) { Map<String, String[]> form = body.asFormUrlEncoded(); sb.append("form[ "); for (Map.Entry<String,String[]> entry : form.entrySet()) { sb.append(entry.getKey()).append(":").append(Arrays.toString(entry.getValue())); } sb.append(" ]"); } if (body.asMultipartFormData() != null) { Http.MultipartFormData mp = body.asMultipartFormData(); List<Http.MultipartFormData.FilePart> files = mp.getFiles(); if (files != null && files.size() > 0) { sb.append("multipart files: ["); for (Http.MultipartFormData.FilePart fp : files) { sb.append(fp.getFilename()); if (!fp.equals(files.get(files.size() - 1))) sb.append(","); } sb.append("]"); } } logger.info(sb.toString()); return delegate.call(context); } } }