Schedule Lock

Schedule Lock

@startuml
set separator none
package java.lang{
  interface Runnable{}
}
package net.javacrumbs.shedlock.core {

interface LockProvider{
  SimpleLock lock(LockConfiguration lockConfiguration)
}
interface SimpleLock {
    void unlock()
}
class LockableRunnable implements Runnable {
  - final LockManager lockManager;
  + void run()
}
interface LockConfigurationExtractor{
  LockConfiguration getLockConfiguration(Runnable task)
}

interface LockManager{
  void executeIfNotLocked(Runnable task)
}

class DefaultLockManager implements LockManager{
  - LockConfigurationExtractor lockConfigurationExtractor
  - LockProvider lockProvider
  + void executeIfNotLocked(Runnable task)
}
class LockConfiguration {
    - final String name
    - final Instant lockUntil
}
annotation SchedulerLock{}
DefaultLockManager *-- LockProvider
DefaultLockManager *-- LockConfigurationExtractor
}

package net.javacrumbs.shedlock.provider.mongo{
class MongoLockProvider implements LockProvider {
  + SimpleLock lock(LockConfiguration lockConfiguration)
}
class MongoLock implements SimpleLock {
  + void unlock()
}
}

package org.springframework.scheduling {
  interface TaskScheduler{}
}

package net.javacrumbs.shedlock.spring{

class LockableTaskScheduler implements TaskScheduler {
  - final TaskScheduler taskScheduler;
  - final LockManager lockManager;
}

class SpringLockConfigurationExtractor implements LockConfigurationExtractor {
  + LockConfiguration getLockConfiguration(Runnable task)
  - boolean shouldLock(SchedulerLock annotation)
}

class SpringLockableTaskSchedulerFactory {
  {static} LockableTaskScheduler newLockableTaskScheduler(TaskScheduler taskScheduler, LockProvider lockProvider)
}
}

@enduml