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);
}
}
}