package we.love.pluto.twitter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cloudone.C1Services;
/**
* Mocked implementation of twitter client. Reads from file. :-)
*
* @author Martin Mares (martin.mares at oracle.com)
* @author Michal Gajdos
*/
final class MockedTwitter extends AbstractAggregator {
private static final Logger LOGGER = LoggerFactory.getLogger(MockedTwitter.class);
private final File file;
private volatile long timestamp = -1;
private volatile Future<?> checker;
MockedTwitter(String fileName) {
if (fileName == null) {
throw new IllegalArgumentException("Argument fileName cannot be null!");
}
file = new File(fileName);
LOGGER.info("Read tweets from file " + file.getPath());
}
@Override
public DataAggregator start(final String... keywords) {
checker = C1Services.getInstance()
.getScheduledExecutorService()
.scheduleAtFixedRate(this::updateStatus, 0, 5, TimeUnit.SECONDS);
return this;
}
@Override
public void stop() {
if (checker != null) {
checker.cancel(true);
}
}
private String readFile() {
if (!file.exists()) {
return null;
}
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (FileInputStream is = new FileInputStream(file)) {
final byte[] buff = new byte[256];
int read;
while ((read = is.read(buff)) > 0) {
baos.write(buff, 0, read);
}
baos.close();
return baos.toString();
} catch (IOException e) {
LOGGER.error("Cannot read file " + file.getPath(), e);
return null;
}
}
synchronized void updateStatus() {
if (file.exists() && timestamp < file.lastModified()) {
LOGGER.info("Reading file.");
timestamp = file.lastModified();
final String message = readFile();
if (message != null) {
message(message, "mock");
}
}
}
}