package fit; import java.io.File; import java.io.IOException; import java.util.Vector; public class SemaphoreFixture extends Fixture { private static final String SEMAPHORE_SUFFIX = ".semaphore"; private static final Vector<String> semaphores = new Vector<>(); @Override public void doTable(Parse table) { String[] args = this.getArgs(); doActionOnSemaphore(args[1], args[0], table.at(0, 0)); super.doTable(table); } @Override public void doRow(Parse row) { this.ignore(row); } private void doActionOnSemaphore(String action, String name, Parse infoCells) { boolean isOk = false; if ("lock".equals(action)) { isOk = lockSemaphore(name); if (!isOk) setForcedAbort(true); } else if ("unlock".equals(action)) isOk = unlockSemaphore(name); else exception(infoCells.parts, new Throwable("Bad action: " + action)); if (isOk) { infoCells.parts.last().more = new Parse("td", makeSemaphoreName(name), null, null); right(infoCells); } else exception(infoCells.parts, new Throwable("Unable to " + action + " semaphore '" + name + "'") ); } private static String makeSemaphoreName(String name) { return System.getProperty("user.dir") + "/semaphores/" + name + SEMAPHORE_SUFFIX; } public static boolean lockSemaphore(String name) { boolean isLocked = semaphores.contains(name); //...already locked? if (!isLocked) { isLocked = createSemaphore(name); if (isLocked) semaphores.add(name); } return isLocked; } public static boolean unlockSemaphore(String name) { boolean isOk = false; if (semaphores.contains(name)) { isOk = deleteSemaphore(name); if (isOk) semaphores.remove(name); } return isOk; } private static boolean createSemaphore(String name) { boolean isLocked = false; //---create the directory if need be File semDiry = new File(makeSemaphoreName("")); semDiry.mkdirs(); //---create the semaphore File semFile = new File(makeSemaphoreName(name)); try { isLocked = semFile.createNewFile(); } catch (IOException e) { isLocked = false; } return isLocked; } private static boolean deleteSemaphore(String name) { boolean isOk = (new File(makeSemaphoreName(name))).delete(); if (!isOk) System.out.print("Unable to remove semaphore '" + name + "'"); return isOk; } public static void ClearSemaphores() { for (String semaphore : semaphores) { unlockSemaphore(semaphore); } } }