package org.piraso.server.bridge;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jackson.map.ObjectMapper;
import org.piraso.api.GeneralPreferenceEnum;
import org.piraso.api.JacksonUtils;
import org.piraso.api.Preferences;
import org.piraso.api.entry.Entry;
import org.piraso.proxy.RegexMethodInterceptorAdapter;
import org.piraso.proxy.RegexMethodInterceptorEvent;
import org.piraso.proxy.RegexProxyFactory;
import org.piraso.server.bridge.net.HttpPirasoLogHandler;
import org.piraso.server.service.*;
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Method;
public class BridgeLoggerServiceImpl extends RegexMethodInterceptorAdapter<Preferences> implements ResponseLoggerService {
private static final Log LOG = LogFactory.getLog(BridgeLoggerServiceImpl.class);
private BridgeLogger logger;
private ObjectMapper mapper;
private BridgeHttpHandlerFactory factory;
private RegexProxyFactory<Preferences> proxyFactory;
public BridgeLoggerServiceImpl(BridgeLogger logger, BridgeHttpHandlerFactory factory) {
this.logger = logger;
this.factory = factory;
mapper = JacksonUtils.MAPPER;
proxyFactory = new RegexProxyFactory<Preferences>(Preferences.class);
proxyFactory.addMethodListener(".*", this);
}
public User getUser() {
return logger.getUser();
}
public String getId() {
return logger.getUser().getActivityUuid();
}
public Long getGlobalId() {
return logger.getGlobalId();
}
public String getWatchedAddr() {
return logger.getWatchedAddr();
}
public boolean isWatched(String remoteAddr) {
return logger.isWatched(remoteAddr);
}
public Preferences getPreferences() {
return proxyFactory.getProxy(logger.getPreferences());
}
public void start() throws Exception {
}
public void stop() throws IOException {
}
public boolean isAlive() {
return true;
}
public boolean isForcedStopped() {
return false;
}
public void stopAndWait(long timeout) throws InterruptedException, IOException {
}
public void log(Entry entry) throws IOException {
if(getPreferences().isEnabled(GeneralPreferenceEnum.NO_REQUEST_CONTEXT.getPropertyName())) {
StringWriter writer = new StringWriter();
mapper.writeValue(writer, entry);
entry = mapper.readValue(writer.toString(), entry.getClass());
entry.setRequestId(getGlobalId());
}
try {
HttpPirasoLogHandler handler = factory.createLogHandler();
handler.setEntry(entry);
handler.setUser(getUser());
handler.execute();
} catch(Exception e) {
LOG.warn(e.getMessage(), e);
}
}
public void addStopListener(StopLoggerListener listener) {
}
public void removeStopListener(StopLoggerListener listener) {
}
public void fireStopEvent(StopLoggerEvent event) {
}
@Override
public void afterCall(RegexMethodInterceptorEvent<Preferences> evt) {
if(BridgeConfig.INSTANCE.getIdentifier() != null) {
boolean bridgeEnabled = logger.getPreferences().isRegexEnabled("bridge." + BridgeConfig.INSTANCE.getIdentifier());
Method method = evt.getInvocation().getMethod();
if(method.getReturnType() == Boolean.TYPE && !bridgeEnabled) {
evt.setReturnedValue(false);
}
}
}
}