1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.backend.jpa.access;
20
21 import java.sql.Timestamp;
22 import java.text.DateFormat;
23 import java.text.SimpleDateFormat;
24 import java.util.Collection;
25 import java.util.List;
26 import java.util.Locale;
27
28 import org.apache.logging.log4j.LogManager;
29 import org.apache.logging.log4j.Logger;
30 import org.mycore.access.mcrimpl.MCRAccessRule;
31 import org.mycore.access.mcrimpl.MCRRuleStore;
32 import org.mycore.backend.jpa.MCREntityManagerProvider;
33 import org.mycore.common.MCRException;
34 import org.mycore.common.config.MCRConfiguration2;
35
36 import com.google.common.cache.CacheBuilder;
37 import com.google.common.cache.CacheLoader;
38 import com.google.common.cache.LoadingCache;
39
40 import jakarta.persistence.EntityManager;
41 import jakarta.persistence.criteria.CriteriaBuilder;
42 import jakarta.persistence.criteria.CriteriaQuery;
43 import jakarta.persistence.criteria.Root;
44
45
46
47
48
49
50
51 public class MCRJPARuleStore extends MCRRuleStore {
52 private static final Logger LOGGER = LogManager.getLogger();
53
54 private static int CACHE_SIZE = MCRConfiguration2.getInt("MCR.AccessPool.CacheSize").orElse(2048);
55
56 private static LoadingCache<String, MCRAccessRule> ruleCache = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE)
57 .build(new CacheLoader<String, MCRAccessRule>() {
58 @Override
59 public MCRAccessRule load(String ruleid) {
60 MCRAccessRule rule = null;
61 EntityManager entityManager = MCREntityManagerProvider.getCurrentEntityManager();
62 MCRACCESSRULE hibrule = entityManager.find(MCRACCESSRULE.class, ruleid);
63 LOGGER.debug("Getting MCRACCESSRULE done");
64
65 if (hibrule != null) {
66 LOGGER.debug("new MCRAccessRule");
67 rule = new MCRAccessRule(ruleid, hibrule.getCreator(), hibrule.getCreationdate(),
68 hibrule.getRule(),
69 hibrule.getDescription());
70 LOGGER.debug("new MCRAccessRule done");
71 }
72 return rule;
73 }
74 });
75
76
77
78
79
80
81
82 @Override
83 public void createRule(MCRAccessRule rule) {
84
85 if (!existsRule(rule.getId())) {
86 EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
87 MCRACCESSRULE hibrule = new MCRACCESSRULE();
88
89 DateFormat df = new SimpleDateFormat(SQL_DATE_FORMAT, Locale.ROOT);
90 hibrule.setCreationdate(Timestamp.valueOf(df.format(rule.getCreationTime())));
91 hibrule.setCreator(rule.getCreator());
92 hibrule.setRid(rule.getId());
93 hibrule.setRule(rule.getRuleString());
94 hibrule.setDescription(rule.getDescription());
95 em.persist(hibrule);
96 } else {
97 LOGGER.error("rule with id '{}' can't be created, rule still exists.", rule.getId());
98 }
99 }
100
101
102
103
104 @Override
105 public Collection<String> retrieveRuleIDs(String ruleExpression, String description) {
106 EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
107 CriteriaBuilder sb = em.getCriteriaBuilder();
108 CriteriaQuery<String> query = sb.createQuery(String.class);
109 Root<MCRACCESSRULE> ar = query.from(MCRACCESSRULE.class);
110 return em.createQuery(
111 query.select(
112 ar.get(MCRACCESSRULE_.rid))
113 .where(
114 sb.and(
115 sb.like(ar.get(MCRACCESSRULE_.rule), ruleExpression),
116 sb.like(ar.get(MCRACCESSRULE_.description), description))))
117 .getResultList();
118 }
119
120
121
122
123 @Override
124 public void updateRule(MCRAccessRule rule) {
125 EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
126 MCRACCESSRULE hibrule = em.find(MCRACCESSRULE.class, rule.getId());
127
128 DateFormat df = new SimpleDateFormat(SQL_DATE_FORMAT, Locale.ROOT);
129 hibrule.setCreationdate(Timestamp.valueOf(df.format(rule.getCreationTime())));
130 hibrule.setCreator(rule.getCreator());
131 hibrule.setRule(rule.getRuleString());
132 hibrule.setDescription(rule.getDescription());
133 ruleCache.put(rule.getId(), rule);
134 }
135
136
137
138
139 @Override
140 public void deleteRule(String ruleid) {
141 EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
142 em.createQuery("delete MCRACCESSRULE where RID = '" + ruleid + "'").executeUpdate();
143 ruleCache.invalidate(ruleid);
144 }
145
146
147
148
149
150
151
152
153 @Override
154 public MCRAccessRule getRule(String ruleid) {
155 return ruleCache.getUnchecked(ruleid);
156 }
157
158 @Override
159 public Collection<String> retrieveAllIDs() {
160 EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
161 CriteriaQuery<String> query = em.getCriteriaBuilder().createQuery(String.class);
162 return em.createQuery(
163 query.select(
164 query.from(MCRACCESSRULE.class).get(MCRACCESSRULE_.rid)))
165 .getResultList();
166 }
167
168
169
170
171
172
173
174
175 @Override
176 public boolean existsRule(String ruleid) throws MCRException {
177 if (ruleCache.getIfPresent(ruleid) != null) {
178 return true;
179 }
180 return MCREntityManagerProvider.getCurrentEntityManager().find(MCRACCESSRULE.class, ruleid) != null;
181 }
182
183 @Override
184 public int getNextFreeRuleID(String prefix) {
185 int ret = 1;
186 EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
187 List<String> l = em
188 .createQuery("select max(rid) from MCRACCESSRULE where rid like '" + prefix + "%'", String.class)
189 .getResultList();
190 if (l.size() > 0) {
191 String max = l.get(0);
192 if (max == null) {
193 ret = 1;
194 } else {
195 int lastNumber = Integer.parseInt(max.substring(prefix.length()));
196 ret = lastNumber + 1;
197 }
198 } else {
199 return 1;
200 }
201 return ret;
202 }
203 }