package com.cloudera.flume.handlers.debug;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cloudera.flume.conf.Context;
import com.cloudera.flume.conf.SinkFactory.SinkDecoBuilder;
import com.cloudera.flume.core.Event;
import com.cloudera.flume.core.EventSink;
import com.cloudera.flume.core.EventSinkDecorator;
import com.google.common.base.Preconditions;
EventSinkDecorator<S> {
public static final Logger LOG = LoggerFactory.getLogger(LazyOpenDecorator.class);
boolean logicallyOpen = false;
boolean actuallyOpen = false;
super(s);
}
@Override
Preconditions.checkState(!logicallyOpen,
"Attempting to open already open LazyOpenDeco");
logicallyOpen = true;
}
@Override
public void append(Event e)
throws IOException {
if (logicallyOpen && !actuallyOpen) {
super.open();
actuallyOpen = true;
}
super.append(e);
}
@Override
public void close()
throws IOException {
if (actuallyOpen) {
super.close();
}
if (!logicallyOpen) {
LOG.warn("Closing a lazy sink that was not logically opened");
}
actuallyOpen = false;
logicallyOpen = false;
}
public static SinkDecoBuilder
builder() {
return new SinkDecoBuilder() {
@Override
public EventSinkDecorator<EventSink>
build(Context context,
String... argv) {
Preconditions.checkArgument(argv.length == 0);
return new LazyOpenDecorator<EventSink>(null);
}
};
}
}