package com.niklim.clicktrace.model.helper;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.google.common.base.Optional;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.niklim.clicktrace.model.ScreenShot;
import com.niklim.clicktrace.model.Session;
import com.niklim.clicktrace.model.dao.SessionPropertiesReader;
import com.niklim.clicktrace.props.UserProperties;
import com.niklim.clicktrace.service.FileManager;
import com.niklim.clicktrace.service.SessionManager;
/**
* Loads {@link ScreenShot} image from the disk.
*/
public class ScreenShotLoader {
@Inject
private FileManager fileManager;
@Inject
private SessionManager sessionManager;
@Inject
private ImageLoader imageLoader;
@Inject
private ScreenShotDeleter deleter;
@Inject
private UserProperties props;
public List<ScreenShot> load(Session session) {
SessionPropertiesReader reader = sessionManager.createSessionPropertiesReader(session);
List<String> filenames = fileManager.loadFileNames(props.getSessionsDirPath() + session.getName(),
new FileManager.ImageFilter());
Optional<Map<String, Integer>> ordering = reader.getOrdering();
List<ScreenShot> shots;
if (ordering.isPresent()) {
shots = loadOrdered(session, reader, filenames, ordering);
} else {
shots = loadUnordered(session, reader, filenames);
}
return shots;
}
private List<ScreenShot> loadUnordered(Session session, SessionPropertiesReader reader, List<String> filenames) {
List<ScreenShot> shots;
shots = Lists.newArrayList();
for (String shotFilename : filenames) {
ScreenShot shot = loadShot(session, reader, shotFilename);
shots.add(shot);
}
return shots;
}
private List<ScreenShot> loadOrdered(Session session, SessionPropertiesReader reader, List<String> filenames,
Optional<Map<String, Integer>> ordering) {
List<ScreenShot> shots = new ArrayList<ScreenShot>(Lists.newArrayList(new ScreenShot[ordering.get().size()]));
// there might be new shots, which have not been ordered yet - store
// them in 'unordered'
List<ScreenShot> unordered = Lists.newArrayList();
for (String shotFilename : filenames) {
ScreenShot shot = loadShot(session, reader, shotFilename);
Integer index = ordering.get().get(shotFilename);
if (index != null) {
shots.set(index, shot);
} else {
unordered.add(shot);
}
}
// shots might have been deleted, but still in ordering
shots = Lists.newArrayList(Collections2.filter(shots, Predicates.notNull()));
shots.addAll(unordered);
return shots;
}
private ScreenShot loadShot(Session session, SessionPropertiesReader reader, String shotFilename) {
ScreenShot shot = new ScreenShot(imageLoader, deleter);
shot.setFilename(shotFilename);
shot.setSession(session);
shot.setLabel(reader.getLabel(shotFilename));
shot.setDescription(reader.getShotDescription(shotFilename));
shot.setClicks(reader.getClicks(shotFilename));
return shot;
}
}