1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.pi.urn;
20
21 import java.util.Comparator;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Objects;
26 import java.util.Optional;
27 import java.util.concurrent.atomic.AtomicInteger;
28 import java.util.function.Predicate;
29 import java.util.regex.Matcher;
30 import java.util.regex.Pattern;
31
32 import org.mycore.pi.MCRPIManager;
33 import org.mycore.pi.MCRPIRegistrationInfo;
34
35
36
37
38 public abstract class MCRCountingDNBURNGenerator extends MCRDNBURNGenerator {
39
40 private static final Map<String, AtomicInteger> PATTERN_COUNT_MAP = new HashMap<>();
41
42 MCRCountingDNBURNGenerator() {
43 super();
44 }
45
46 protected AtomicInteger readCountFromDatabase(String countPattern) {
47 Pattern regExpPattern = Pattern.compile(countPattern);
48 Predicate<String> matching = regExpPattern.asPredicate();
49
50 List<MCRPIRegistrationInfo> list = MCRPIManager.getInstance()
51 .getList(MCRDNBURN.TYPE, -1, -1);
52
53
54 Optional<Integer> highestNumber = list.stream()
55 .map(MCRPIRegistrationInfo::getIdentifier)
56 .filter(matching)
57 .map(pi -> {
58
59 Matcher matcher = regExpPattern.matcher(pi);
60 if (matcher.find() && matcher.groupCount() == 1) {
61 String group = matcher.group(1);
62 return Integer.parseInt(group, 10);
63 } else {
64 return null;
65 }
66 }).filter(Objects::nonNull)
67 .min(Comparator.reverseOrder())
68 .map(n -> n + 1);
69 return new AtomicInteger(highestNumber.orElse(0));
70 }
71
72
73
74
75
76
77
78
79
80
81 public final synchronized int getCount(String pattern) {
82 AtomicInteger count = PATTERN_COUNT_MAP
83 .computeIfAbsent(pattern, this::readCountFromDatabase);
84
85 return count.getAndIncrement();
86 }
87 }