From 3b1c506bd98fc967d9680cde0eebbee9ecf80b3f Mon Sep 17 00:00:00 2001 From: dsyer Date: Sat, 14 Mar 2009 09:12:10 +0000 Subject: [PATCH] RESOLVED: BATCH-1146 Added MD5 hashing to JobParameters in JDBC instance dao --- .../repository/dao/JdbcJobInstanceDao.java | 24 ++++++++++++++++--- .../dao/JdbcJobInstanceDaoTests.java | 21 ++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) 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 576a97087..d3645348d 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 @@ -16,6 +16,10 @@ package org.springframework.batch.core.repository.dao; +import java.io.UnsupportedEncodingException; +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; @@ -112,15 +116,29 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements return jobInstance; } - private String createJobKey(JobParameters jobParameters) { + protected String createJobKey(JobParameters jobParameters) { Map props = jobParameters.getParameters(); StringBuffer stringBuffer = new StringBuffer(); for (Entry entry : props.entrySet()) { stringBuffer.append(entry.toString() + ";"); } - - return stringBuffer.toString(); + + MessageDigest digest; + try { + digest = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("MD5 algorithm not available. Fatal (should be in the JDK)."); + } + + try { + byte[] bytes = digest.digest(stringBuffer.toString().getBytes("UTF-8")); + return String.format("%032x", new BigInteger(1, bytes)); + } + catch (UnsupportedEncodingException e) { + throw new IllegalStateException("UTF-8 encoding not available. Fatal (should be in the JDK)."); + } } /** 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 5b4762937..0567610c4 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,11 +1,17 @@ package org.springframework.batch.core.repository.dao; +import static org.junit.Assert.*; + +import java.math.BigInteger; +import java.security.MessageDigest; + import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.junit.Assert; +import org.junit.Test; import org.junit.runner.RunWith; @@ -19,6 +25,7 @@ public class JdbcJobInstanceDaoTests extends AbstractJobInstanceDaoTests { return (JobInstanceDao) applicationContext.getBean("jobInstanceDao"); } + @Test public void testFindJobInstanceByExecution(){ JobExecutionDao jobExecutionDao = (JobExecutionDao) applicationContext.getBean("jobExecutionDao"); @@ -30,4 +37,18 @@ public class JdbcJobInstanceDaoTests extends AbstractJobInstanceDaoTests { JobInstance returnedInstance = dao.getJobInstance(jobExecution); Assert.assertEquals(jobInstance, returnedInstance); } + + @Test + public void testHexing() throws Exception { + MessageDigest digest = MessageDigest.getInstance("MD5"); + byte[] bytes = digest.digest("f78spx".getBytes("UTF-8")); + StringBuffer output = new StringBuffer(); + for (byte bite : bytes) { + output.append(String.format("%02x", bite)); + } + assertEquals("Wrong hash: "+output,32, output.length()); + String value = String.format("%032x", new BigInteger(1, bytes)); + assertEquals("Wrong hash: "+value,32, value.length()); + assertEquals(value, output.toString()); + } }