Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
d829343
Build failed resolved
ravishanigarapu Apr 16, 2025
eb9cc5b
Merge branch 'PSMRI:develop' into develop
ravishanigarapu May 20, 2025
71c072d
jwttoken and user-agent validation
ravishanigarapu May 22, 2025
b4eeadf
null check
ravishanigarapu May 22, 2025
722893f
Code optimize and performance
ravishanigarapu Jul 30, 2025
a79da7f
Performance increase
ravishanigarapu Jul 30, 2025
94b0b27
Merge branch 'develop' into develop
ravishanigarapu Jul 30, 2025
19bd619
Build errors
ravishanigarapu Jul 30, 2025
7f46e65
Test cases ignored
ravishanigarapu Jul 30, 2025
a16090b
Ignored test cases
ravishanigarapu Jul 30, 2025
2cac39d
Security hotspot fix
ravishanigarapu Jul 31, 2025
bfa8575
security hotspot issue
ravishanigarapu Aug 1, 2025
1f3c87b
performance check
ravishanigarapu Aug 1, 2025
e079f4a
Uncommented test file
ravishanigarapu Aug 5, 2025
5166320
Merge branch 'develop' into develop
ravishanigarapu Aug 5, 2025
eea7dee
Corrected test cases
ravishanigarapu Aug 5, 2025
921f69f
indent format change
ravishanigarapu Aug 5, 2025
372de77
Coderabbit comments
ravishanigarapu Aug 6, 2025
ac13f53
test cases corrected
ravishanigarapu Aug 7, 2025
877c772
Test cases corrected
ravishanigarapu Aug 7, 2025
603590f
1 test case failing
ravishanigarapu Aug 7, 2025
1ed97bf
Corrected junit test cases
ravishanigarapu Aug 7, 2025
68ec126
Test cases corrected
ravishanigarapu Aug 7, 2025
7307f1d
test cases
ravishanigarapu Aug 7, 2025
ce83428
code rabbit comments addressed
ravishanigarapu Aug 7, 2025
fe48e8b
removed unused imports
ravishanigarapu Aug 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,13 @@
*/
package com.iemr.common.bengen.service;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

Expand All @@ -45,17 +42,34 @@
import com.iemr.common.bengen.utils.Generator;
import com.iemr.common.bengen.utils.config.ConfigProperties;

import jakarta.annotation.PreDestroy;
import jakarta.transaction.Transactional;

@Service
public class GenerateBeneficiaryService {
private static final Logger logger = LoggerFactory.getLogger(GenerateBeneficiaryService.class);
private ExecutorService executor = Executors.newCachedThreadPool();
private static final int BATCH_SIZE = 500;
private static final String ADMIN_BATCH = "admin-batch";
@Autowired
JdbcTemplate jdbcTemplate;

@Autowired
BeneficiaryIdRepo beneficiaryIdRepo;

@PreDestroy
public void cleanup() {
logger.info("Shutting down executor service");
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}
public void generateBeneficiaryIDs() throws Exception {
logger.info("BengenApplication.run start");
long strt = System.currentTimeMillis();
Expand All @@ -69,26 +83,33 @@ public void generateBeneficiaryIDs() throws Exception {
long fin = System.currentTimeMillis() - strt;
logger.info("BengenApplication.run finish. time = " + fin + " ms.");
}

@Transactional
public void createFile() {
logger.info("BengenApplication.createFile start");
long strt = System.currentTimeMillis();

Integer count = ConfigProperties.getInteger("no-of-benID-to-be-generate");
List<Object[]> batchArgs = createBatchData(count);
logger.info("BengenApplication.createFile start");
long strt = System.currentTimeMillis();

// Batch insert using JdbcTemplate
String sql = "INSERT INTO `db_identity`.`m_beneficiaryregidmapping` " +
"(`BeneficiaryID`, `Provisioned`, `Deleted`, `CreatedDate`, `CreatedBy`) " +
"VALUES (?, b'0', b'0', ?, ?)";
Integer count = ConfigProperties.getInteger("no-of-benID-to-be-generate");

List<Object[]> batchArgs = createBatchData(count);

// Batch insert using JdbcTemplate
String sql = "INSERT INTO `db_identity`.`m_beneficiaryregidmapping` "
+ "(`BeneficiaryID`, `Provisioned`, `Deleted`, `CreatedDate`, `CreatedBy`) "
+ "VALUES (?, b'0', b'0', ?, ?)";

for (int i = 0; i < batchArgs.size(); i += BATCH_SIZE) {
List<Object[]> batch = batchArgs.subList(i, Math.min(i + BATCH_SIZE, batchArgs.size()));
try {
jdbcTemplate.batchUpdate(sql, batch);
} catch (Exception e) {
logger.error("Failed to insert batch starting at index {}: {}", i, e.getMessage());
throw new RuntimeException("Batch insert failed", e);
}
}

for (int i = 0; i < batchArgs.size(); i += BATCH_SIZE) {
List<Object[]> batch = batchArgs.subList(i, Math.min(i + BATCH_SIZE, batchArgs.size()));
jdbcTemplate.batchUpdate(sql, batch);
}

long fin = System.currentTimeMillis() - strt;
logger.info("BengenApplication.createFile finish. time = " + fin + " ms.");
long fin = System.currentTimeMillis() - strt;
logger.info("BengenApplication.createFile finish. time = " + fin + " ms.");
}

public List<Object[]> createBatchData(int num) {
Expand All @@ -103,7 +124,7 @@ public List<Object[]> createBatchData(int num) {
.mapToObj(i -> new Object[]{
g.generateBeneficiaryId(), // Assuming it's thread-safe
ts,
"admin-batch"
ADMIN_BATCH
})
.collect(Collectors.toList());

Expand Down
42 changes: 14 additions & 28 deletions src/main/java/com/iemr/common/bengen/utils/Generator.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ public class Generator {
private static final Logger log = LoggerFactory.getLogger(Generator.class);
private static final BigInteger TEN = BigInteger.TEN;
private static final BigInteger TEN_POW_10 = TEN.pow(10);

private static final SecureRandom SECURE_RANDOM = new SecureRandom();

public BigInteger generateBeneficiaryId() {
BigInteger bid1 = generateFirst();
Expand Down Expand Up @@ -68,27 +70,13 @@ public BigInteger generateFirst() {
return BigInteger.valueOf(digit).multiply(TEN_POW_10);
}

protected BigInteger generateNumN(int n) {
int[] source = new int[n];
int[] target = new int[n];

for (int i = 0; i < n; i++) {
source[i] = getRandomDigit();
}

for (int i = 0, j = n - 1; i < n; i++, j--) {
int num = (j == 0) ? getRandomDigit() : getRandomDigit() % j;
target[j] = source[i];
source[i] = num;
}

StringBuilder sb = new StringBuilder(n);
for (int value : target) {
sb.append(value);
}

return new BigInteger(sb.toString());
}
protected BigInteger generateNumN(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append(getRandomDigit());
}
return new BigInteger(sb.toString());
}

public int getDigitCount(BigInteger number) {
double factor = Math.log10(2);
Expand All @@ -97,20 +85,18 @@ public int getDigitCount(BigInteger number) {
}

private int getRandomDigit() {
SecureRandom secureRandom = new SecureRandom();
return secureRandom.nextInt(10);
return SECURE_RANDOM.nextInt(10);

}

private int getRandomInRange(int min, int max) {
SecureRandom sr = new SecureRandom();
if (min > max) {
throw new IllegalArgumentException("min must be <= max");
}
if (max == Integer.MAX_VALUE) {
return sr.nextInt(max - min) + min;
}
return sr.nextInt(min, max + 1); // safe here
if (max == Integer.MAX_VALUE || (long) max - min + 1 > Integer.MAX_VALUE) {
return SECURE_RANDOM.nextInt(min, max + 1);
}
return SECURE_RANDOM.nextInt(min, max + 1);
}

// Optional: only if you need debugging arrays
Expand Down
Loading
Loading