package no.difi.datahotel.logic;
import no.difi.datahotel.model.Metadata;
import no.difi.datahotel.model.Result;
import no.difi.datahotel.util.*;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import static no.difi.datahotel.util.Filesystem.FOLDER_CACHE_CHUNK;
import static no.difi.datahotel.util.Filesystem.FOLDER_SLAVE;
@Component("chunk")
public class ChunkBean {
private Map<String, Long> posts = new HashMap<String, Long>();
private int size = 100;
// TODO: Move
public File getFullDataset(Metadata metadata) {
return Filesystem.getFile(FOLDER_SLAVE, metadata.getLocation(), Filesystem.FILE_DATASET);
}
// TODO: Move
public File getMetadata(Metadata metadata) {
return Filesystem.getFile(FOLDER_SLAVE, metadata.getLocation(), Filesystem.FILE_METADATA);
}
// TODO: Move
public File getFields(Metadata metadata) {
return Filesystem.getFile(FOLDER_SLAVE, metadata.getLocation(), Filesystem.FILE_FIELDS);
}
public void update(Metadata metadata) {
MetadataLogger logger = metadata.getLogger();
Timestamp ts = new Timestamp(FOLDER_CACHE_CHUNK, metadata.getLocation(), "timestamp");
if (metadata.getUpdated() == ts.getTimestamp()) {
posts.put(metadata.getLocation(), ts.getLong("posts"));
logger.info("Chunk up to date.");
return;
}
logger.info("Building chunk.");
try {
String locationTmp = metadata.getLocation() + "-tmp." + System.currentTimeMillis();
CSVReader parser = new CSVReader(getFullDataset(metadata));
CSVWriter writer = null;
long number = 0, counter = 0;
while (parser.hasNext()) {
counter++;
if (counter % size == 1) {
number++;
String filename = "dataset-" + number + ".csv";
writer = new CSVWriter(Filesystem.getFile(FOLDER_CACHE_CHUNK, locationTmp, filename));
writer.writeHeader(parser.getHeaders());
}
writer.write(parser.getNextLineArray());
if (counter % size == 0) {
writer.close();
writer = null;
}
}
if (writer != null)
writer.close();
File goal = Filesystem.getFolderPath(FOLDER_CACHE_CHUNK, metadata.getLocation());
Filesystem.delete(FOLDER_CACHE_CHUNK, metadata.getLocation());
Filesystem.getFolderPath(FOLDER_CACHE_CHUNK, locationTmp).renameTo(goal);
posts.put(metadata.getLocation(), counter);
ts.setTimestamp(metadata.getUpdated());
ts.set("posts", counter);
ts.save();
} catch (Exception e) {
// TODO Start sending exceptions.
logger.log(Level.WARNING, e.getMessage(), e);
}
}
public Result get(Metadata metadata, long page) {
MetadataLogger logger = metadata.getLogger();
Result result = new Result();
result.setPage(page);
result.setPosts(posts.containsKey(metadata.getLocation()) ? posts.get(metadata.getLocation()) : 0);
if (page <= result.getPages()) {
try {
File source = Filesystem.getFile(FOLDER_CACHE_CHUNK, metadata.getLocation(), "dataset-" + page + ".csv");
if (source.isFile()) {
List<Map<String, String>> data = new ArrayList<Map<String, String>>();
CSVReader parser = new CSVReader(source);
while (parser.hasNext())
data.add(parser.getNextLine());
parser.close();
result.setEntries(data);
}
} catch (Exception e) {
logger.log(Level.WARNING, e.getMessage());
}
}
return result;
}
}