diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/LastModifiedResourceComparator.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/LastModifiedResourceComparator.java new file mode 100644 index 000000000..e523a4961 --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/LastModifiedResourceComparator.java @@ -0,0 +1,53 @@ +/* + * Copyright 2006-2007 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.support; + +import java.io.IOException; +import java.util.Comparator; + +import org.springframework.core.io.Resource; +import org.springframework.util.Assert; + +/** + * Comparator to sort resources by the file last modified time. + * + * @author Dave Syer + * + */ +public class LastModifiedResourceComparator implements Comparator { + + /** + * Compare the two resources by last modified time, so that a sorted list of + * resources will have oldest first. + * + * @throws IllegalArgumentException if one of the resources doesn't exist or + * its last modified date cannot be determined + * + * @see Comparator#compare(Object, Object) + */ + public int compare(Resource r1, Resource r2) { + Assert.isTrue(r1.exists(), "Resource does not exist: " + r1); + Assert.isTrue(r2.exists(), "Resource does not exist: " + r2); + try { + long diff = r1.getFile().lastModified() - r2.getFile().lastModified(); + return diff > 0 ? 1 : diff < 0 ? -1 : 0; + } + catch (IOException e) { + throw new IllegalArgumentException("Resource modification times cannot be determined (unexpected).", e); + } + } + +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/LastModifiedResourceComparatorTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/LastModifiedResourceComparatorTests.java new file mode 100644 index 000000000..ea7db07cf --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/LastModifiedResourceComparatorTests.java @@ -0,0 +1,72 @@ +/* + * Copyright 2006-2007 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.support; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.io.FileUtils; +import org.junit.Test; +import org.springframework.core.io.FileSystemResource; + +/** + * @author Dave Syer + * + */ +public class LastModifiedResourceComparatorTests { + + private LastModifiedResourceComparator comparator = new LastModifiedResourceComparator(); + + @Test(expected = IllegalArgumentException.class) + public void testCompareTwoNonExistent() { + comparator.compare(new FileSystemResource("garbage"), new FileSystemResource("crap")); + } + + @Test(expected = IllegalArgumentException.class) + public void testCompareOneNonExistent() { + comparator.compare(new FileSystemResource("pom.xml"), new FileSystemResource("crap")); + } + + @Test + public void testCompareSame() { + assertEquals(0, comparator.compare(new FileSystemResource("pom.xml"), new FileSystemResource("pom.xml"))); + } + + @Test + public void testCompareNewWithOld() throws IOException { + File temp = File.createTempFile(getClass().getSimpleName(), ".txt"); + temp.deleteOnExit(); + assertTrue(temp.exists()); + assertEquals(1, comparator.compare(new FileSystemResource(temp), new FileSystemResource("pom.xml"))); + } + + @Test + public void testCompareNewWithOldAfterCopy() throws IOException { + File temp1 = File.createTempFile(getClass().getSimpleName(), ".txt"); + temp1.deleteOnExit(); + File temp2 = File.createTempFile(getClass().getSimpleName(), ".txt"); + temp2.deleteOnExit(); + assertTrue(temp1.exists() && temp2.exists()); + // Need to explicitly ask not to preserve the last modified date when we + // copy... + FileUtils.copyFile(new File("pom.xml"), temp1, false); + assertEquals(1, comparator.compare(new FileSystemResource(temp1), new FileSystemResource(temp2))); + } + +}