diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java index 8bb1c6fab..7d4da1812 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013 the original author or authors. + * Copyright 2006-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -305,11 +305,9 @@ JobInstanceDao, InitializingBean { } @Override - public List findJobInstancesByName(String jobName,final int start, - final int count) { + public List findJobInstancesByName(String jobName, final int start, final int count) { @SuppressWarnings("rawtypes") ResultSetExtractor extractor = new ResultSetExtractor() { - private List list = new ArrayList(); @Override @@ -326,14 +324,11 @@ JobInstanceDao, InitializingBean { } return list; } - }; - //check if the name contains a wildcard if (jobName.contains(STAR_WILDCARD)) { - //swap for sql wildcard jobName = jobName.replaceAll("\\" + STAR_WILDCARD, SQL_WILDCARD); - }//end if + } @SuppressWarnings("unchecked") List result = (List) getJdbcTemplate().query(getQuery(FIND_LAST_JOBS_LIKE_NAME), diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java index 1a89a5337..14728487f 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2013 the original author or authors. + * Copyright 2006-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,8 @@ import org.springframework.util.Assert; * In-memory implementation of {@link JobInstanceDao}. */ public class MapJobInstanceDao implements JobInstanceDao { + private static final String STAR_WILDCARD = "\\*"; + private static final String STAR_WILDCARD_PATTERN = ".*"; // JDK6 Make a ConcurrentSkipListSet: tends to add on end private final Map jobInstances = new ConcurrentHashMap(); @@ -95,17 +97,10 @@ public class MapJobInstanceDao implements JobInstanceDao { result.add(instance); } } - Collections.sort(result, new Comparator() { - // sort by ID descending - @Override - public int compare(JobInstance o1, JobInstance o2) { - return Long.signum(o2.getId() - o1.getId()); - } - }); - int startIndex = Math.min(start, result.size()); - int endIndex = Math.min(start + count, result.size()); - return result.subList(startIndex, endIndex); + sortDescending(result); + + return subset(result, start, count); } @Override @@ -135,6 +130,35 @@ public class MapJobInstanceDao implements JobInstanceDao { @Override public List findJobInstancesByName(String jobName, int start, int count) { - return getJobInstances(jobName,start,count); + List result = new ArrayList(); + String convertedJobName = jobName.replaceAll(STAR_WILDCARD, STAR_WILDCARD_PATTERN); + + for (Map.Entry instanceEntry : jobInstances.entrySet()) { + JobInstance instance = instanceEntry.getValue(); + + if(instance.getJobName().matches(convertedJobName)) { + result.add(instance); + } + } + + sortDescending(result); + + return subset(result, start, count); + } + + private void sortDescending(List result) { + Collections.sort(result, new Comparator() { + @Override + public int compare(JobInstance o1, JobInstance o2) { + return Long.signum(o2.getId() - o1.getId()); + } + }); + } + + private List subset(List jobInstances, int start, int count) { + int startIndex = Math.min(start, jobInstances.size()); + int endIndex = Math.min(start + count, jobInstances.size()); + + return jobInstances.subList(startIndex, endIndex); } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java index 0f0f61299..02fa041c2 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2013 the original author or authors. + * Copyright 2008-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -91,18 +91,16 @@ public class JdbcJobInstanceDaoTests extends AbstractJobInstanceDaoTests { @Test public void testJobInstanceWildcard() { - //look up a job using a wildcard (* substituted to %) - // unrelated job instance that should be ignored by the query dao.createJobInstance("anotherJob", new JobParameters()); - // we need two instances of the same job to check ordering dao.createJobInstance("someJob", new JobParameters()); - //now look for them + List jobInstances = dao.findJobInstancesByName("*Job", 0, 2); assertEquals(2, jobInstances.size()); + for (JobInstance instance : jobInstances) { assertTrue(instance.getJobName().contains("Job")); - }//end for - //try with after wildcards + } + jobInstances = dao.getJobInstances("Job*", 0, 2); assertTrue(jobInstances.isEmpty()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapJobInstanceDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapJobInstanceDaoTests.java index b5fd057ec..b5411520f 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapJobInstanceDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/MapJobInstanceDaoTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2008-2012 the original author or authors. + * Copyright 2008-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,15 @@ */ package org.springframework.batch.core.repository.dao; +import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import org.springframework.batch.core.JobInstance; +import org.springframework.batch.core.JobParameters; + +import java.util.List; + +import static org.junit.Assert.assertTrue; @RunWith(JUnit4.class) public class MapJobInstanceDaoTests extends AbstractJobInstanceDaoTests { @@ -26,4 +33,30 @@ public class MapJobInstanceDaoTests extends AbstractJobInstanceDaoTests { return new MapJobInstanceDao(); } + @Test + public void testWildcardPrefix() { + MapJobInstanceDao mapJobInstanceDao = new MapJobInstanceDao(); + mapJobInstanceDao.createJobInstance("testJob", new JobParameters()); + mapJobInstanceDao.createJobInstance("Jobtest", new JobParameters()); + List jobInstances = mapJobInstanceDao.findJobInstancesByName("*Job", 0, 2); + assertTrue("Invalid matching job instances found, expected 1, got: " + jobInstances.size(), jobInstances.size() == 1); + } + + @Test + public void testWildcardSuffix() { + MapJobInstanceDao mapJobInstanceDao = new MapJobInstanceDao(); + mapJobInstanceDao.createJobInstance("testJob", new JobParameters()); + mapJobInstanceDao.createJobInstance("Jobtest", new JobParameters()); + List jobInstances = mapJobInstanceDao.findJobInstancesByName("Job*", 0, 2); + assertTrue("No matching job instances found, expected 1, got: " + jobInstances.size(), jobInstances.size() == 1); + } + + @Test + public void testWildcardRange() { + MapJobInstanceDao mapJobInstanceDao = new MapJobInstanceDao(); + mapJobInstanceDao.createJobInstance("testJob", new JobParameters()); + mapJobInstanceDao.createJobInstance("Jobtest", new JobParameters()); + List jobInstances = mapJobInstanceDao.findJobInstancesByName("*Job*", 0, 2); + assertTrue("No matching job instances found, expected 2, got: " + jobInstances.size(), jobInstances.size() == 2); + } }