// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.collide.client.testutil; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.impl.SchedulerImpl; /** * Scheduler implementation that allows to disable scheduling at runtime. * */ public class TestSchedulerImpl extends SchedulerImpl { /** * Implementation that ignores scheduled tasks. */ public static class NoOpScheduler extends Scheduler { @Override public void scheduleDeferred(ScheduledCommand scheduledCommand) {} @Override public void scheduleEntry(RepeatingCommand repeatingCommand) {} @Override public void scheduleEntry(ScheduledCommand scheduledCommand) {} @Override public void scheduleFinally(RepeatingCommand repeatingCommand) {} @Override public void scheduleFinally(ScheduledCommand scheduledCommand) {} @Override public void scheduleFixedDelay(RepeatingCommand repeatingCommand, int i) {} @Override public void scheduleFixedPeriod(RepeatingCommand repeatingCommand, int i) {} @Override public void scheduleIncremental(RepeatingCommand repeatingCommand) {} } /** * Implementation that throws exception on its methods invocation. */ public static class AngryScheduler extends Scheduler { @Override public void scheduleDeferred(ScheduledCommand scheduledCommand) { throw new IllegalStateException("No scheduling allowed"); } @Override public void scheduleEntry(RepeatingCommand repeatingCommand) { throw new IllegalStateException("No scheduling allowed"); } @Override public void scheduleEntry(ScheduledCommand scheduledCommand) { throw new IllegalStateException("No scheduling allowed"); } @Override public void scheduleFinally(RepeatingCommand repeatingCommand) { throw new IllegalStateException("No scheduling allowed"); } @Override public void scheduleFinally(ScheduledCommand scheduledCommand) { throw new IllegalStateException("No scheduling allowed"); } @Override public void scheduleFixedDelay(RepeatingCommand repeatingCommand, int i) { throw new IllegalStateException("No scheduling allowed"); } @Override public void scheduleFixedPeriod(RepeatingCommand repeatingCommand, int i) { throw new IllegalStateException("No scheduling allowed"); } @Override public void scheduleIncremental(RepeatingCommand repeatingCommand) { throw new IllegalStateException("No scheduling allowed"); } } public static final Scheduler NO_OP_SCHEDULER_IMPL = new NoOpScheduler(); private static Scheduler scheduler; @Override public void scheduleDeferred(ScheduledCommand cmd) { if (scheduler != null) { scheduler.scheduleDeferred(cmd); } else { super.scheduleDeferred(cmd); } } @Override public void scheduleEntry(RepeatingCommand cmd) { if (scheduler != null) { scheduler.scheduleEntry(cmd); } else { super.scheduleEntry(cmd); } } @Override public void scheduleEntry(ScheduledCommand cmd) { if (scheduler != null) { scheduler.scheduleEntry(cmd); } else { super.scheduleEntry(cmd); } } @Override public void scheduleFinally(RepeatingCommand cmd) { if (scheduler != null) { scheduler.scheduleFinally(cmd); } else { super.scheduleFinally(cmd); } } @Override public void scheduleFinally(ScheduledCommand cmd) { if (scheduler != null) { scheduler.scheduleFinally(cmd); } else { super.scheduleFinally(cmd); } } @Override public void scheduleFixedDelay(RepeatingCommand cmd, int delayMs) { if (scheduler != null) { scheduler.scheduleFixedDelay(cmd, delayMs); } else { super.scheduleFixedDelay(cmd, delayMs); } } @Override public void scheduleFixedPeriod(RepeatingCommand cmd, int delayMs) { if (scheduler != null) { scheduler.scheduleFixedPeriod(cmd, delayMs); } super.scheduleFixedPeriod(cmd, delayMs); } @Override public void scheduleIncremental(RepeatingCommand cmd) { if (scheduler != null) { scheduler.scheduleIncremental(cmd); } else { super.scheduleIncremental(cmd); } } public static void setNoOp(boolean noOp) { if (noOp) { if (scheduler != null) { throw new IllegalStateException("Can enter noOp mode only from standard mode"); } scheduler = NO_OP_SCHEDULER_IMPL; } else { if (scheduler != NO_OP_SCHEDULER_IMPL) { throw new IllegalStateException("Can enter standard mode only from noOp mode"); } scheduler = null; } } public static void runWithSpecificScheduler(Runnable runnable, Scheduler taskScheduler) { if (scheduler != NO_OP_SCHEDULER_IMPL) { throw new IllegalStateException("Can run runWithSpecificScheduler only from noOp mode"); } try { scheduler = taskScheduler; runnable.run(); if (scheduler != taskScheduler) { throw new IllegalStateException("Scheduler has been changed during execution"); } } finally { scheduler = NO_OP_SCHEDULER_IMPL; } } }