1 package com.atlassian.scheduler.tenancy;
2
3 import com.atlassian.scheduler.SchedulerService;
4 import com.atlassian.scheduler.SchedulerServiceException;
5 import com.atlassian.scheduler.config.JobConfig;
6 import com.atlassian.scheduler.config.JobId;
7 import com.atlassian.scheduler.core.DelegatingSchedulerService;
8 import com.atlassian.scheduler.core.LifecycleAwareSchedulerService;
9 import com.atlassian.scheduler.core.RunningJob;
10 import com.atlassian.tenancy.api.TenantAccessor;
11 import com.google.common.collect.Iterables;
12
13 import javax.annotation.Nonnull;
14 import java.util.Collection;
15 import java.util.concurrent.TimeUnit;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 public class TenantAwareSchedulerService extends DelegatingSchedulerService implements LifecycleAwareSchedulerService {
55 private final LifecycleAwareSchedulerService delegate;
56 private final TenantAccessor tenantAccessor;
57
58 public TenantAwareSchedulerService(LifecycleAwareSchedulerService delegate, TenantAccessor tenantAccessor) {
59 super(delegate);
60 this.delegate = delegate;
61 this.tenantAccessor = tenantAccessor;
62 }
63
64 @Override
65 public void scheduleJob(JobId jobId, JobConfig jobConfig) throws SchedulerServiceException {
66 assertTenantAvailable();
67 super.scheduleJob(jobId, jobConfig);
68 }
69
70 @Nonnull
71 @Override
72 public JobId scheduleJobWithGeneratedId(JobConfig jobConfig) throws SchedulerServiceException {
73 assertTenantAvailable();
74 return super.scheduleJobWithGeneratedId(jobConfig);
75 }
76
77 @Override
78 public void start() throws SchedulerServiceException {
79 delegate.start();
80 }
81
82 @Override
83 public void standby() throws SchedulerServiceException {
84 delegate.standby();
85 }
86
87 @Override
88 public void shutdown() {
89 delegate.shutdown();
90 }
91
92 @Override
93 @Nonnull
94 public Collection<RunningJob> getLocallyRunningJobs() {
95 return delegate.getLocallyRunningJobs();
96 }
97
98 @Override
99 public boolean waitUntilIdle(long timeout, TimeUnit units) throws InterruptedException {
100 return delegate.waitUntilIdle(timeout, units);
101 }
102
103 @Override
104 @Nonnull
105 public State getState() {
106 return delegate.getState();
107 }
108
109 private void assertTenantAvailable() {
110 if (Iterables.isEmpty(tenantAccessor.getAvailableTenants())) {
111 throw new IllegalStateException("You are not allowed to schedule jobs before a tenant is available.");
112 }
113 }
114 }