Skip to content

Commit 8d2cb53

Browse files
committed
Cleanup
1 parent 58599b9 commit 8d2cb53

12 files changed

Lines changed: 171 additions & 211 deletions
Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
package com.twcable.grabbit.spring.batch.repository
22

33
import org.springframework.batch.core.repository.dao.ExecutionContextDao
4+
import org.springframework.batch.item.ExecutionContext;
5+
46

57
/**
6-
* Created by sagar.sane on 4/7/16.
8+
* Modified DAO Interface for persisting and retrieving {@link ExecutionContext}
9+
* @see ExecutionContextDao for more details
710
*/
811
interface GrabbitExecutionContextDao extends ExecutionContextDao {
912

10-
//Find executionContexts/job by "executionId" on executionContexts/job == "executionId" on jobExecutions
13+
/**
14+
* Returns job execution context paths by comparing "executionId" property on "executionContext/job/<id>" with
15+
* "executionId" property on JobExecutions for the @param jobExecutionResourcePaths
16+
*/
1117
public List<String> getJobExecutionContextPaths(List<String> jobExecutionResourcePaths)
1218

13-
//Find executionContexts/step by "executionId" on executionContexts/step == "id" on stepExecutionsToRemove
19+
/**
20+
* Returns step execution context paths by comparing "executionId" property on "executionContext/job/<id>" with
21+
* "id" property on StepExecutions for the @param stepExecutionResourcePaths
22+
*/
1423
public List<String> getStepExecutionContextPaths(List<String> stepExecutionResourcePaths)
15-
}
24+
}
Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
package com.twcable.grabbit.spring.batch.repository
22

33
import org.springframework.batch.core.BatchStatus
4+
import org.springframework.batch.core.JobExecution
45
import org.springframework.batch.core.repository.dao.JobExecutionDao
56

67
/**
7-
* Created by sagar.sane on 4/7/16.
8+
* Modified DAO Interface for persisting and retrieving {@link JobExecution}
9+
* @see JobExecutionDao for more details
810
*/
911
interface GrabbitJobExecutionDao extends JobExecutionDao{
1012

11-
//Find jobExecutions that are older than "hours" from now
12-
public List<String> getOlderJobExecutions(int hours)
13+
/**
14+
* Returns job execution paths for given BatchStatuses
15+
*/
16+
public List<String> getJobExecutions(List<BatchStatus> batchStatuses)
1317

14-
}
18+
/**
19+
* Returns older job execution paths which ended @param hours ago from "Now"
20+
*/
21+
public List<String> getOlderJobExecutions(int hours, List<String> jobExecutionPaths)
22+
23+
}
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package com.twcable.grabbit.spring.batch.repository
22

3+
import org.springframework.batch.core.JobInstance
34
import org.springframework.batch.core.repository.dao.JobInstanceDao
45

56
/**
6-
* Created by sagar.sane on 4/7/16.
7+
* Modified DAO Interface for persisting and retrieving {@link JobInstance}
8+
* @see JobInstanceDao for more details
79
*/
810
interface GrabbitJobInstanceDao extends JobInstanceDao {
911

10-
//Find jobInstances by "id" on jobInstances == instanceId on jobExecutions
12+
/**
13+
* Returns job instance paths by comparing "id" property on "jobInstances" with
14+
* "instanceId" property on JobExecutions for the @param jobExecutionResourcePaths
15+
*/
1116
public List<String> getJobInstancePaths(List<String> jobExecutionResourcePaths)
1217

13-
}
18+
}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package com.twcable.grabbit.spring.batch.repository
22

3+
import org.springframework.batch.core.StepExecution
34
import org.springframework.batch.core.repository.dao.StepExecutionDao
45

6+
/**
7+
* Modified DAO Interface for persisting and retrieving {@link StepExecution}
8+
* @see StepExecutionDao for more details
9+
*/
510
interface GrabbitStepExecutionDao extends StepExecutionDao {
611

7-
//Find stepExecutions by "jobExecutionId" on stepExecutions == "executionId" on jobExecutions
12+
/**
13+
* Returns step execution paths by comparing "jobExecutionId" property on "stepExecutions with
14+
* "executionId" property on JobExecutions for the @param jobExecutionResourcePaths
15+
*/
816
public List<String> getStepExecutionPaths(List<String> jobExecutionResourcePaths)
9-
}
17+
}

grabbit/src/main/groovy/com/twcable/grabbit/spring/batch/repository/JcrExecutionContextDao.groovy

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ import com.twcable.grabbit.jcr.JcrUtil
2020
import com.twcable.grabbit.util.CryptoUtil
2121
import groovy.transform.CompileStatic
2222
import groovy.util.logging.Slf4j
23-
import org.apache.sling.api.resource.ModifiableValueMap
24-
import org.apache.sling.api.resource.Resource
25-
import org.apache.sling.api.resource.ResourceResolver
26-
import org.apache.sling.api.resource.ResourceResolverFactory
27-
import org.apache.sling.api.resource.ValueMap
23+
import org.apache.sling.api.resource.*
2824
import org.springframework.batch.core.JobExecution
2925
import org.springframework.batch.core.StepExecution
3026
import org.springframework.batch.core.repository.ExecutionContextSerializer
@@ -33,7 +29,6 @@ import org.springframework.batch.item.ExecutionContext
3329

3430
import javax.annotation.Nonnull
3531

36-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.EXECUTION_ID
3732
import static com.twcable.grabbit.spring.batch.repository.JcrStepExecutionDao.ID
3833
import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED
3934
import static org.apache.sling.api.resource.ResourceUtil.getOrCreateResource

grabbit/src/main/groovy/com/twcable/grabbit/spring/batch/repository/JcrJobExecutionDao.groovy

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import org.springframework.batch.core.repository.dao.JobExecutionDao
3030
import javax.annotation.Nonnull
3131

3232
import static JcrJobInstanceDao.JOB_INSTANCE_ROOT
33-
import static com.twcable.grabbit.spring.batch.repository.JcrStepExecutionDao.END_TIME
3433
import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED
3534
import static org.apache.sling.api.resource.ResourceUtil.getOrCreateResource
3635

@@ -383,10 +382,12 @@ class JcrJobExecutionDao extends AbstractJcrDao implements GrabbitJobExecutionDa
383382
}
384383
}
385384

386-
private List<String> getJobExecutions(List<BatchStatus> batchStatuses) {
385+
@Override
386+
List<String> getJobExecutions(List<BatchStatus> batchStatuses) {
387+
String statusPredicate = batchStatuses.collect { "s.status = '${it}'" }.join('or')
387388
JcrUtil.manageResourceResolver(resourceResolverFactory) { ResourceResolver resolver ->
388389
String jobExecutionsQuery = "select * from [nt:unstructured] as s where " +
389-
"ISDESCENDANTNODE(s,'${JOB_EXECUTION_ROOT}') AND ( s.status = 'FAILED' or s.status = 'COMPLETED' )"
390+
"ISDESCENDANTNODE(s,'${JOB_EXECUTION_ROOT}') AND ( ${statusPredicate} )"
390391
List<String> jobExecutions = resolver.findResources(jobExecutionsQuery, "JCR-SQL2")
391392
.toList()
392393
.collect { it.path }
@@ -398,9 +399,8 @@ class JcrJobExecutionDao extends AbstractJcrDao implements GrabbitJobExecutionDa
398399
}
399400

400401
@Override
401-
List<String> getOlderJobExecutions(int hours) {
402+
List<String> getOlderJobExecutions(int hours, List<String> jobExecutions) {
402403
JcrUtil.manageResourceResolver(resourceResolverFactory) { ResourceResolver resolver ->
403-
List<String> jobExecutions = getJobExecutions(null)
404404
//Create a Date object that is "hours" ago from now
405405
Calendar olderThanHours = Calendar.getInstance()
406406
log.info "Current time: ${olderThanHours.time}"

grabbit/src/main/groovy/com/twcable/grabbit/spring/batch/repository/services/impl/DefaultCleanJobRepository.groovy

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.twcable.grabbit.spring.batch.repository.services.impl
22

3-
import com.twcable.grabbit.DateUtil
43
import com.twcable.grabbit.jcr.JcrUtil
5-
import com.twcable.grabbit.spring.batch.repository.JcrExecutionContextDao
64
import com.twcable.grabbit.spring.batch.repository.JcrJobRepositoryFactoryBean
75
import com.twcable.grabbit.spring.batch.repository.services.CleanJobRepository
86
import groovy.transform.CompileStatic
@@ -14,15 +12,9 @@ import org.apache.felix.scr.annotations.Service
1412
import org.apache.sling.api.resource.Resource
1513
import org.apache.sling.api.resource.ResourceResolver
1614
import org.apache.sling.api.resource.ResourceResolverFactory
17-
import org.apache.sling.api.resource.ValueMap
15+
import org.springframework.batch.core.BatchStatus
1816
import org.springframework.context.ConfigurableApplicationContext
1917

20-
import static com.twcable.grabbit.spring.batch.repository.JcrExecutionContextDao.JOB_EXECUTION_CONTEXT_ROOT
21-
import static com.twcable.grabbit.spring.batch.repository.JcrExecutionContextDao.STEP_EXECUTION_CONTEXT_ROOT
22-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.*
23-
import static com.twcable.grabbit.spring.batch.repository.JcrJobInstanceDao.JOB_INSTANCE_ROOT
24-
import static com.twcable.grabbit.spring.batch.repository.JcrStepExecutionDao.*
25-
2618
@Slf4j
2719
@CompileStatic
2820
@Component(label = "Grabbit Clean Job Repository Service", description = "Grabbit Clean Job Repository Service", immediate = true, metatype = true, enabled = true)
@@ -48,7 +40,8 @@ class DefaultCleanJobRepository implements CleanJobRepository {
4840

4941
JcrJobRepositoryFactoryBean jobRepositoryFactoryBean = configurableApplicationContext.getBean(JcrJobRepositoryFactoryBean)
5042

51-
List<String> olderThanHoursJobExecutions = jobRepositoryFactoryBean.jobExecutionDao.getOlderJobExecutions(hours)
43+
List<String> jobExecutionPaths = jobRepositoryFactoryBean.jobExecutionDao.getJobExecutions([BatchStatus.FAILED, BatchStatus.COMPLETED])
44+
List<String> olderThanHoursJobExecutions = jobRepositoryFactoryBean.jobExecutionDao.getOlderJobExecutions(hours, jobExecutionPaths)
5245
List<String> jobInstancesToRemove = jobRepositoryFactoryBean.jobInstanceDao.getJobInstancePaths(olderThanHoursJobExecutions)
5346
List<String> stepExecutionsToRemove = jobRepositoryFactoryBean.stepExecutionDao.getStepExecutionPaths(olderThanHoursJobExecutions)
5447
List<String> jobExecutionContextsToRemove = jobRepositoryFactoryBean.executionContextDao.getJobExecutionContextPaths(olderThanHoursJobExecutions)

grabbit/src/test/groovy/com/twcable/grabbit/spring/batch/repository/JcrExecutionContextDaoSpec.groovy

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,14 @@ import org.apache.sling.api.resource.ResourceResolverFactory
2121
import org.springframework.batch.core.JobExecution
2222
import org.springframework.batch.core.StepExecution
2323
import org.springframework.batch.core.repository.ExecutionContextSerializer
24+
import spock.lang.Ignore
2425
import spock.lang.Shared
2526
import spock.lang.Specification
2627
import spock.lang.Subject
2728

2829
import static com.twcable.grabbit.spring.batch.repository.JcrExecutionContextDao.EXECUTION_CONTEXT
2930
import static com.twcable.grabbit.spring.batch.repository.JcrExecutionContextDao.EXECUTION_ID
30-
import static com.twcable.jackalope.JCRBuilder.node
31-
import static com.twcable.jackalope.JCRBuilder.property
32-
import static com.twcable.jackalope.JCRBuilder.repository
31+
import static com.twcable.jackalope.JCRBuilder.*
3332

3433
@Subject(JcrExecutionContextDao)
3534
class JcrExecutionContextDaoSpec extends Specification {
@@ -102,6 +101,26 @@ class JcrExecutionContextDaoSpec extends Specification {
102101
result.containsKey("deserialized")
103102
}
104103

104+
@Ignore('TODO: Implement this test when Jackalope implements resourceResolver.findResources() API')
105+
def "GetJobExecutionContextPaths for JobExecutionPaths"() {
106+
when:
107+
final executionContextDao = new JcrExecutionContextDao(mockFactory, stubSerializer)
108+
final result = executionContextDao.getJobExecutionContextPaths([])
109+
110+
then:
111+
1 == 1
112+
}
113+
114+
@Ignore('TODO: Implement this test when Jackalope implements resourceResolver.findResources() API')
115+
def "GetStepExecutionContextPaths for JobExecutionPaths"() {
116+
when:
117+
final executionContextDao = new JcrExecutionContextDao(mockFactory, stubSerializer)
118+
final result = executionContextDao.getStepExecutionContextPaths([])
119+
120+
then:
121+
1 == 1
122+
123+
}
105124

106125
class StubExecutionContextSerializer implements ExecutionContextSerializer {
107126

grabbit/src/test/groovy/com/twcable/grabbit/spring/batch/repository/JcrJobExecutionDaoSpec.groovy

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,8 @@ import spock.lang.Shared
2525
import spock.lang.Specification
2626
import spock.lang.Subject
2727

28-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.CREATE_TIME
29-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.END_TIME
30-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.EXECUTION_ID
31-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.EXIT_CODE
32-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.EXIT_MESSAGE
33-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.INSTANCE_ID
34-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.JOB_NAME
35-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.STATUS
36-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.TRANSACTION_ID
37-
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.VERSION
38-
import static com.twcable.jackalope.JCRBuilder.node
39-
import static com.twcable.jackalope.JCRBuilder.property
40-
import static com.twcable.jackalope.JCRBuilder.repository
28+
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.*
29+
import static com.twcable.jackalope.JCRBuilder.*
4130

4231
@Subject(JcrJobExecutionDao)
4332
class JcrJobExecutionDaoSpec extends Specification {
@@ -86,7 +75,20 @@ class JcrJobExecutionDaoSpec extends Specification {
8675
property(CREATE_TIME, "2014-12-29T16:59:18.669-05:00"),
8776
property(END_TIME, "NULL"),
8877
property(JOB_NAME, "someOtherJob")
89-
)
78+
),
79+
node("4",
80+
property(INSTANCE_ID, 1),
81+
property(EXECUTION_ID, 1),
82+
property(TRANSACTION_ID, 5),
83+
property(STATUS, "FAILED"),
84+
property(EXIT_CODE, "code"),
85+
property(EXIT_MESSAGE, "message"),
86+
property(CREATE_TIME, "2014-12-27T16:59:18.669-05:00"),
87+
property(END_TIME, "2015-12-29T16:59:18.669-05:00"),
88+
property(JOB_NAME, "someJob"),
89+
property(VERSION, 1)
90+
91+
),
9092
),
9193
node("jobInstances",
9294
node("1"))
@@ -116,7 +118,7 @@ class JcrJobExecutionDaoSpec extends Specification {
116118

117119
then:
118120
result != null
119-
result.size() == 2
121+
result.size() == 3
120122
result.first().id == 2
121123
}
122124

@@ -178,6 +180,21 @@ class JcrJobExecutionDaoSpec extends Specification {
178180

179181
then:
180182
unsyncronized.version == 1
181-
unsyncronized.status == BatchStatus.COMPLETED
183+
unsyncronized.status == BatchStatus.FAILED
184+
}
185+
186+
def "GetOlderJobExecutions for hours and jobExecutions"() {
187+
when:
188+
final jobExecutionDao = new JcrJobExecutionDao(mockFactory)
189+
final jobExecutionPaths = [
190+
"/var/grabbit/job/repository/jobExecutions/1",
191+
"/var/grabbit/job/repository/jobExecutions/4"
192+
]
193+
final result = jobExecutionDao.getOlderJobExecutions(1, jobExecutionPaths)
194+
195+
then:
196+
result != null
197+
result.size() == 2
182198
}
199+
183200
}

grabbit/src/test/groovy/com/twcable/grabbit/spring/batch/repository/JcrJobInstanceDaoSpec.groovy

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,15 @@ package com.twcable.grabbit.spring.batch.repository
1818

1919
import com.twcable.jackalope.impl.sling.SimpleResourceResolverFactory
2020
import org.apache.sling.api.resource.ResourceResolverFactory
21-
import org.springframework.batch.core.DefaultJobKeyGenerator
22-
import org.springframework.batch.core.JobExecution
23-
import org.springframework.batch.core.JobInstance
24-
import org.springframework.batch.core.JobParameter
25-
import org.springframework.batch.core.JobParameters
21+
import org.springframework.batch.core.*
2622
import spock.lang.Shared
2723
import spock.lang.Specification
2824
import spock.lang.Subject
2925
import spock.lang.Unroll
3026

31-
import static com.twcable.grabbit.spring.batch.repository.JcrJobInstanceDao.INSTANCE_ID
32-
import static com.twcable.grabbit.spring.batch.repository.JcrJobInstanceDao.KEY
33-
import static com.twcable.grabbit.spring.batch.repository.JcrJobInstanceDao.NAME
34-
import static com.twcable.jackalope.JCRBuilder.node
35-
import static com.twcable.jackalope.JCRBuilder.property
36-
import static com.twcable.jackalope.JCRBuilder.repository
27+
import static com.twcable.grabbit.spring.batch.repository.JcrJobExecutionDao.*
28+
import static com.twcable.grabbit.spring.batch.repository.JcrJobInstanceDao.*
29+
import static com.twcable.jackalope.JCRBuilder.*
3730

3831
@Subject(JcrJobInstanceDao)
3932
class JcrJobInstanceDaoSpec extends Specification {
@@ -66,7 +59,34 @@ class JcrJobInstanceDaoSpec extends Specification {
6659
property(INSTANCE_ID, 4),
6760
property(NAME, "someOtherJob"),
6861
)
69-
)
62+
),
63+
node("jobExecutions",
64+
node("1",
65+
property(JcrJobExecutionDao.INSTANCE_ID, 1),
66+
property(EXECUTION_ID, 1),
67+
property(TRANSACTION_ID, 5),
68+
property(STATUS, "COMPLETED"),
69+
property(EXIT_CODE, "code"),
70+
property(EXIT_MESSAGE, "message"),
71+
property(CREATE_TIME, "2014-12-27T16:59:18.669-05:00"),
72+
property(END_TIME, "2014-12-29T16:59:18.669-05:00"),
73+
property(JOB_NAME, "someJob"),
74+
property(VERSION, 1)
75+
),
76+
node("4",
77+
property(JcrJobExecutionDao.INSTANCE_ID, 4),
78+
property(EXECUTION_ID, 1),
79+
property(TRANSACTION_ID, 5),
80+
property(STATUS, "FAILED"),
81+
property(EXIT_CODE, "code"),
82+
property(EXIT_MESSAGE, "message"),
83+
property(CREATE_TIME, "2014-12-27T16:59:18.669-05:00"),
84+
property(END_TIME, "2015-12-29T16:59:18.669-05:00"),
85+
property(JOB_NAME, "someJob"),
86+
property(VERSION, 1)
87+
88+
),
89+
),
7090
)
7191
)
7292
)
@@ -146,4 +166,20 @@ class JcrJobInstanceDaoSpec extends Specification {
146166
then:
147167
result.containsAll(["someJob", "someOtherJob"])
148168
}
169+
170+
def "GetJobInstancePaths for jobExecutions"() {
171+
when:
172+
final jobInstanceDao = new JcrJobInstanceDao(mockFactory)
173+
final jobExecutionPaths = [
174+
"/var/grabbit/job/repository/jobExecutions/1",
175+
"/var/grabbit/job/repository/jobExecutions/4"
176+
]
177+
178+
final result = jobInstanceDao.getJobInstancePaths(jobExecutionPaths)
179+
180+
then:
181+
result != null
182+
result.size() == 2
183+
}
184+
149185
}

0 commit comments

Comments
 (0)