package org.sikuli.recorder.event; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Charsets; import com.google.common.collect.Lists; import com.google.common.io.Files; public class Events { static private Logger logger = LoggerFactory.getLogger(Events.class); static public List<Event> readEventsFrom(File inputDir){ List<Event> events = Lists.newArrayList(); File[] files = inputDir.listFiles(); // sort the files so that they are chronologically ordered // we assume that the name ordering reflects its chronological order Arrays.sort(files); for (File f : files){ String s = f.getPath(); if (s.contains("click.txt")){ try { String jsonString = Files.toString(f, Charsets.US_ASCII); ClickEvent clickEvent = ClickEvent.createFromJSON(jsonString); events.add(clickEvent); logger.trace("read event:" + clickEvent); } catch (IOException e1) { } }else if (s.contains("screenshot.png")){ ScreenShotEvent screenShotEvent = ScreenShotEvent.createFromFile(f); events.add(screenShotEvent); } } return events; } static public List<ClickEventGroup> getClickEventGroups(List<Event> events){ List<ClickEventGroup >slideDataList = Lists.newArrayList(); for (int i = 0; i < events.size(); ++i) { Event e = events.get(i); if (e instanceof ClickEvent){ ClickEvent clickEvent = (ClickEvent) e; ScreenShotEvent screenShotEventBefore = Events.findScreenShotEventBefore(events, i); boolean isClickEventNext = (i < events.size() - 1) && events.get(i+1) instanceof ClickEvent; if (isClickEventNext){ // if it's immediately followed by a click event, it is probably // the first click event of a double-click event, so we ignore this one // and wait to process the next one continue; } if (screenShotEventBefore != null){ ClickEventGroup data = new ClickEventGroup(); data.setClickEvent(clickEvent); data.setScreenShotEventBefore(screenShotEventBefore); slideDataList.add(data); } } } return slideDataList; } static private ScreenShotEvent findScreenShotEventBefore(List<Event> events, int start) { for (int i = start; i >= 0; i--){ Event e = events.get(i); if (e instanceof ScreenShotEvent) return (ScreenShotEvent) e; } return null; } }