package com.vtence.molecule.middlewares;
import com.vtence.molecule.Request;
import com.vtence.molecule.Response;
import java.time.Clock;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.function.Consumer;
import java.util.logging.Logger;
public abstract class ApacheLogger extends AbstractMiddleware {
private static final String DATE_FORMAT = "dd/MMM/yyyy:HH:mm:ss Z";
protected final Logger logger;
private final Clock clock;
private final DateTimeFormatter formatter;
protected ApacheLogger(Logger logger) {
this(logger, Clock.systemDefaultZone(), Locale.getDefault());
}
protected ApacheLogger(Logger logger, Clock clock, Locale locale) {
this.logger = logger;
this.clock = clock;
this.formatter = DateTimeFormatter.ofPattern(DATE_FORMAT, locale).withZone(clock.getZone());
}
@Override
public void handle(Request request, Response response) throws Exception {
// Capture original request values
Consumer<Response> logAccess = logAccess(request);
forward(request, response).whenSuccessful(logAccess);
}
protected abstract Consumer<Response> logAccess(Request request);
protected String nullToEmpty(String string) {
return (string == null) ? "" : string;
}
protected String currentTime() {
return ZonedDateTime.now(clock).format(formatter);
}
protected Object contentLengthOf(Response response) {
return response.size() > 0 ? response.size() : "-";
}
}