package org.activiti.crystalball.simulator.impl.clock; /* 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. */ import org.activiti.engine.ActivitiException; import org.activiti.engine.runtime.Clock; import org.springframework.beans.factory.FactoryBean; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; /** * This class provides thread local clock implementation. Each thread can run its own simulation engine and * can behave according to its internal thread local clock */ public class ThreadLocalClock implements Clock { private volatile static ThreadLocal<Clock> THREAD_CLOCK = new ThreadLocal<Clock>(); protected FactoryBean<Clock> clockFactory; public ThreadLocalClock(FactoryBean<Clock> clockFactory) { this.clockFactory = clockFactory; } @Override public void setCurrentTime(Date currentTime) { get().setCurrentTime(currentTime); } private Clock get() { if (THREAD_CLOCK.get() == null) { try { THREAD_CLOCK.set(clockFactory.getObject()); } catch (Exception e) { throw new ActivitiException("Unable to get simulation clock", e); } } return THREAD_CLOCK.get(); } @Override public void setCurrentCalendar(Calendar currentTime) { get().setCurrentCalendar(currentTime); } @Override public void reset() { get().reset(); } @Override public Date getCurrentTime() { return get().getCurrentTime(); } @Override public Calendar getCurrentCalendar() { return get().getCurrentCalendar(); } @Override public Calendar getCurrentCalendar(TimeZone timeZone) { return get().getCurrentCalendar(timeZone); } @Override public TimeZone getCurrentTimeZone() { return get().getCurrentTimeZone(); } }