package tc.oc.pgm.rotation; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.time.Instant; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; /** * Abstract implementation of {@link RotationProvider}. */ public abstract class AbstractRotationProvider implements RotationProvider { @Override public @Nonnull Map<String, RotationState> getRotations() { synchronized(this) { return ImmutableMap.copyOf(this.rotations); } } @Override public @Nullable RotationState getRotation(@Nonnull String name) { Preconditions.checkNotNull(name, "rotation name"); synchronized(this) { return this.rotations.get(name); } } protected boolean setRotation(@Nonnull String name, @Nonnull RotationState rotation) { Preconditions.checkNotNull(name, "name"); Preconditions.checkNotNull(rotation, "rotation"); return this.setRotation(name, rotation, Instant.now()); } protected boolean setRotation(@Nonnull String name, @Nonnull RotationState rotation, @Nonnull Instant loadTime) { Preconditions.checkNotNull(name, "rotation name"); Preconditions.checkNotNull(rotation, "rotation"); Preconditions.checkNotNull(loadTime, "rotation load time"); synchronized(this) { Instant lastLoaded = this.rotationsLastLoadedTime.get(name); if(lastLoaded != null && lastLoaded.isAfter(loadTime)) { return false; } this.rotations.put(name, rotation); this.rotationsLastLoadedTime.put(name, loadTime); } return true; } private final Map<String, RotationState> rotations = Maps.newHashMap(); private final Map<String, Instant> rotationsLastLoadedTime = Maps.newHashMap(); }