1 package org.torweg.pulse.component.core.accesscontrol.admin;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import net.sf.json.JSONArray;
7 import net.sf.json.JSONObject;
8
9 import org.hibernate.Criteria;
10 import org.hibernate.Session;
11 import org.hibernate.Transaction;
12 import org.hibernate.criterion.Criterion;
13 import org.hibernate.criterion.DetachedCriteria;
14 import org.hibernate.criterion.MatchMode;
15 import org.hibernate.criterion.Order;
16 import org.hibernate.criterion.Projections;
17 import org.hibernate.criterion.Property;
18 import org.hibernate.criterion.Restrictions;
19 import org.hibernate.criterion.Subqueries;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22 import org.torweg.pulse.accesscontrol.AbstractAccessControlObject;
23 import org.torweg.pulse.accesscontrol.User;
24 import org.torweg.pulse.accesscontrol.User.State;
25 import org.torweg.pulse.bundle.Controller;
26 import org.torweg.pulse.invocation.lifecycle.Lifecycle;
27 import org.torweg.pulse.service.PulseException;
28 import org.torweg.pulse.service.request.ServiceRequest;
29 import org.torweg.pulse.util.entity.AbstractBasicEntity;
30
31
37 public abstract class AbstractAccessControlEditor extends Controller {
38
39
42 protected static final Logger LOGGER = LoggerFactory
43 .getLogger(AccessControlEditor.class);
44
45
57 protected final JSONArray loadAssorterData(final ServiceRequest request,
58 final Class<? extends AbstractBasicEntity> clazz, final String alias) {
59
60 Long id = Long.parseLong(request.getCommand().getParameter("id")
62 .getFirstValue());
63
64 boolean isAsoc = false;
65 if (request.getCommand().getParameter("unasoc") != null) {
66 isAsoc = Boolean.parseBoolean(request.getCommand()
67 .getParameter("unasoc").getFirstValue());
68 }
69
70 Session s = Lifecycle.getHibernateDataSource().createNewSession();
72 Transaction tx = s.beginTransaction();
73 JSONArray data = null;
74
75 try {
76
77 Criteria criteria = buildLoadAssorterCriteria(request, isAsoc, s,
79 id, clazz, alias);
80
81 long total = processCriteriaForPaging(request, criteria);
83
84 @SuppressWarnings("unchecked")
86 List<AbstractAccessControlObject> loadedObjects = (List<AbstractAccessControlObject>) criteria
87 .addOrder(Order.asc("name").ignoreCase()).list();
88
89 data = buildDataJSONArray(isAsoc, total, loadedObjects);
91
92 tx.commit();
93 } catch (Exception e) {
94 tx.rollback();
95 throw new PulseException(getClass().getSimpleName() + ".load"
96 + clazz.getSimpleName() + "s.failed: "
97 + e.getLocalizedMessage(), e);
98 } finally {
99 s.close();
100 }
101 return data;
102 }
103
104
118 @SuppressWarnings("unchecked")
119 protected final JSONArray loadAssorterData(final ServiceRequest request,
120 final Session s,
121 final Class<? extends AbstractAccessControlObject> clazz,
122 final List<Long> ids) {
123
124 boolean isAsoc = false;
125 if (request.getCommand().getParameter("unasoc") != null) {
126 isAsoc = Boolean.parseBoolean(request.getCommand()
127 .getParameter("unasoc").getFirstValue());
128 }
129
130 Criteria criteria = buildLoadAssorterCriteria(request, isAsoc, s, ids,
131 clazz);
132
133 long total = 0;
134 List<AbstractAccessControlObject> loadedObjects;
135 if (criteria != null) {
136 total = processCriteriaForPaging(request, criteria);
137 loadedObjects = (List<AbstractAccessControlObject>) criteria
139 .addOrder(Order.asc("name").ignoreCase()).list();
140 } else {
141 loadedObjects = new ArrayList<AbstractAccessControlObject>();
142 }
143
144 return buildDataJSONArray(isAsoc, total, loadedObjects);
146 }
147
148
162 private JSONArray buildDataJSONArray(final boolean isAsoc,
163 final long total,
164 final List<AbstractAccessControlObject> loadedObjects) {
165 JSONArray data = new JSONArray();
166 boolean totalSet = false;
167 for (AbstractAccessControlObject acObj : loadedObjects) {
168 JSONObject json = acObj.toJSON();
169 if (!totalSet) {
170 json.put("total", total);
171 totalSet = true;
172 }
173 json.put("initialAsoc", !isAsoc);
174 data.add(json);
175 }
176 return data;
177 }
178
179
202 protected final Criteria buildLoadAssorterCriteria(
203 final ServiceRequest request, final boolean unasoc,
204 final Session s, final Long id,
205 final Class<? extends AbstractBasicEntity> clazz, final String alias) {
206
207 Criterion nameCriterion = buildCriterionFromRequest(request, "filter",
208 "name");
209
210 Criteria criteria;
211 if (unasoc) {
212 DetachedCriteria dc = DetachedCriteria.forClass(clazz)
214 .createAlias(alias, "r").add(Restrictions.eq("r.id", id))
215 .setProjection(Property.forName("id"));
216
217 criteria = s.createCriteria(clazz).add(
218 Restrictions.not(Subqueries.propertyIn("id", dc)));
219 } else {
220 criteria = s.createCriteria(clazz).createAlias(alias, "r")
222 .add(Restrictions.eq("r.id", id));
223 }
224
225 if (clazz.getCanonicalName().equals(User.class.getCanonicalName())) {
227 criteria.add(Restrictions.ne("state", State.EXPUNGED));
228 }
229
230 if (nameCriterion != null) {
232 criteria.add(nameCriterion);
233 }
234 return criteria;
235 }
236
237
257 protected final Criteria buildLoadAssorterCriteria(
258 final ServiceRequest request, final boolean unasoc,
259 final Session s, final List<Long> ids,
260 final Class<? extends AbstractBasicEntity> clazz) {
261
262 Criterion filterCriterion = buildCriterionFromRequest(request,
264 "filter", "name");
265
266 Criteria criteria;
267
268 if (unasoc) {
269 criteria = s.createCriteria(clazz);
270 if (!ids.isEmpty()) {
271 criteria.add(Restrictions.not(Restrictions.in("id", ids)));
272 }
273 } else {
274 if (!ids.isEmpty()) {
275 criteria = s.createCriteria(clazz).add(
276 Restrictions.in("id", ids));
277
278 } else {
279 return null;
280 }
281 }
282
283 if (filterCriterion != null) {
285 criteria.add(filterCriterion);
286 }
287
288 return criteria; }
290
291
303 protected final List<Object> retrieveAssorterObjects(
304 final String identifier, final ServiceRequest request,
305 final String clazz, final Session s) {
306
307 List<Object> list = new ArrayList<Object>();
308
309 if (request.getCommand().getParameter(identifier) != null
311 && request.getCommand().getParameter(identifier).getValues()
312 .size() > 0) {
313
314 List<String> ids = request.getCommand().getParameter(identifier)
316 .getValues();
317
318 for (String id : ids) {
320 try {
321 list.add(s.createQuery("from " + clazz + " c where c.id=?")
322 .setLong(0, Long.parseLong(id)).uniqueResult());
323 } catch (NumberFormatException e) {
324 LOGGER.debug(
325 "EXCEPTION.ignored: AccessControlEditor.retrieveAssorterObjects(id:{}, clazz:{}, identifier:{}) \"{}\"",
326 new Object[] { id, clazz, identifier,
327 e.getLocalizedMessage() });
328 }
329 }
330
331 }
332
333 return list;
334 }
335
336
350 protected final Criterion buildCriterionFromRequest(
351 final ServiceRequest request, final String parameterName,
352 final String propertyName) {
353 if (request.getCommand().getParameter(parameterName) != null
354 && !request.getCommand().getParameter(parameterName)
355 .getFirstValue().trim().equals("")) {
356 return Restrictions.ilike(propertyName, request.getCommand()
357 .getParameter(parameterName).getFirstValue().trim(),
358 MatchMode.ANYWHERE);
359 }
360 return null;
361 }
362
363
372 protected final Criterion buildIdCriterionFromRequest(
373 final ServiceRequest request) {
374 if (request.getCommand().getParameter("id") != null
375 && !request.getCommand().getParameter("id").getFirstValue()
376 .trim().equals("")) {
377 try {
378 return Restrictions.idEq(Long.parseLong(request.getCommand()
379 .getParameter("id").getFirstValue().trim()));
380 } catch (NumberFormatException e) {
381 return Restrictions.idEq(0L);
382 }
383
384 }
385 return null;
386 }
387
388
399 protected final long processCriteriaForPaging(final ServiceRequest request,
400 final Criteria criteria) {
401
402 int start = Integer.parseInt(request.getCommand().getParameter("start")
403 .getFirstValue());
404 int limit = Integer.parseInt(request.getCommand().getParameter("limit")
405 .getFirstValue());
406
407 long total = (Long) criteria.setProjection(Projections.rowCount())
408 .uniqueResult();
409
410 criteria.setProjection(null);
412 criteria.setResultTransformer(Criteria.ROOT_ENTITY);
413
414 if (total > start) {
416 criteria.setFirstResult(start).setMaxResults(limit);
417 } else {
418 criteria.setFirstResult(0).setMaxResults(limit);
419 }
420
421 return total;
422
423 }
424
425
437 protected final String getReqParamOrNullIfValueEmpty(
438 final ServiceRequest request, final String parameterName) {
439 if (request.getCommand().getParameter(parameterName) != null
440 && !request.getCommand().getParameter(parameterName)
441 .getFirstValue().trim().equals("")) {
442 return request.getCommand().getParameter(parameterName)
443 .getFirstValue().trim();
444 }
445 return null;
446 }
447
448
460 protected final String getReqParamIgnoreEmptyValue(
461 final ServiceRequest request, final String parameterName) {
462 if (request.getCommand().getParameter(parameterName) != null) {
463 return request.getCommand().getParameter(parameterName)
464 .getFirstValue().trim();
465 }
466 return null;
467 }
468
469 }
470