// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.components; import java.util.HashMap; import java.util.Map; import java.util.Random; import util.Clock; import fitnesse.wiki.PageData; import fitnesse.wiki.WikiPage; public class SaveRecorder { public static Random ticketNumGen = new Random(); private static Map<String, Long> ticketRegistry = new HashMap<String, Long>(); private static Map<String, Long> saveTime = new HashMap<String, Long>(); public static long pageSaved(PageData data, long ticketNumber) { long timeStamp = timeStamp(); WikiPage page = data.getWikiPage(); String name = page.getPageCrawler().getFullPath(page).toString(); ticketRegistry.put(name, ticketNumber); saveTime.put(name, timeStamp); return timeStamp; } public static boolean changesShouldBeMerged(long thisEditTime, long ticket, PageData data) { return new MergeDeterminer(thisEditTime, ticket, data).shouldMerge(); } public static long timeStamp() { return Clock.currentTimeInMillis(); } public static long newTicket() { return ticketNumGen.nextLong(); } // Called by tests to simulate clean environment. public static void clear() { ticketRegistry.clear(); saveTime.clear(); } private static class MergeDeterminer { private long thisEditTime; private long ticket; private WikiPage page; private String fullPageName; public MergeDeterminer(long thisEditTime, long ticket, PageData data) { this.thisEditTime = thisEditTime; this.ticket = ticket; page = data.getWikiPage(); fullPageName = page.getPageCrawler().getFullPath(page).toString(); } public boolean shouldMerge() { return isSaveOutOfOrder() && !isSameEditSession(); } private boolean isSameEditSession() { boolean sameEdit = false; if (ticketRegistry.containsKey(fullPageName)) { long pageTicketId = ticketRegistry.get(fullPageName); if (pageTicketId == ticket) { sameEdit = true; } } return sameEdit; } private boolean isSaveOutOfOrder() { boolean returnValue; returnValue = false; if (saveTime.containsKey(fullPageName)) { long lastSaveTime = saveTime.get(fullPageName); if (lastSaveTime > thisEditTime) { returnValue = true; } } return returnValue; } } }