package org.herac.tuxguitar.util; public class TGSynchronizer { private static TGSynchronizer instance; private TGSynchronizerController controller; private TGSynchronizer(){ super(); } public static TGSynchronizer instance(){ if (instance == null) { synchronized (TGSynchronizer.class) { instance = new TGSynchronizer(); } } return instance; } public void execute(TGRunnable runnable) throws TGException { TGSynchronizerTask task = new TGSynchronizerTask(runnable); this.controller.execute(task); if( task.getThrowable() != null ){ throw task.getThrowable(); } } public void executeLater(TGRunnable runnable) throws TGException { TGSynchronizerTask task = new TGSynchronizerTask(runnable); this.controller.executeLater(task); if( task.getThrowable() != null ){ throw task.getThrowable(); } } public void setController(TGSynchronizerController controller){ this.controller = controller; } public class TGSynchronizerTask{ private TGRunnable runnable; private TGException throwable; public TGSynchronizerTask(TGRunnable runnable){ this.runnable = runnable; this.throwable = null; } public TGException getThrowable(){ return this.throwable; } public void run(){ try{ this.runnable.run(); } catch(TGException tgException){ this.throwable = tgException; } catch(Throwable throwable){ this.throwable = new TGException(throwable); } } } public interface TGRunnable { public void run() throws TGException; } public interface TGSynchronizerController{ public void execute(TGSynchronizerTask task); public void executeLater(TGSynchronizerTask task); } }