1
2
3
4
5
6
7 package org.weda.store.impl;
8
9 import java.util.HashMap;
10 import java.util.HashSet;
11 import java.util.Map;
12 import java.util.Set;
13 import org.weda.store.AuditOperation;
14 import org.weda.store.Auditable;
15 import org.weda.store.AuditableObject;
16 import org.weda.store.AuditableObjectRegistry;
17 import org.weda.store.AuditableProperty;
18 import org.weda.store.AuditableObjectRegistryException;
19
20 /**
21 *
22 * @author Mikhail Titov
23 */
24 public class AuditableObjectRegistryImpl implements AuditableObjectRegistry{
25 private Map<AuditOperation, Map<Class, Set<String>>> objectProperties;
26 private Map<Class, AuditableObject> auditableObjects;
27
28 public void init() throws AuditableObjectRegistryException {
29 if (auditableObjects.size()>0)
30 objectProperties =
31 new HashMap<AuditOperation, Map<Class, Set<String>>>();
32 for (AuditableObject obj: auditableObjects.values()){
33 if (!Auditable.class.isAssignableFrom(obj.getObjectClass()))
34 throw new AuditableObjectRegistryException(
35 String.format(
36 "Domain class (%s) must implements " +
37 "org.weda.store.Auditable interface " +
38 "to be auditable", obj.getObjectClass().getName()));
39 for (AuditableProperty prop: obj.getObjectProperties()){
40 String[] opers =
41 prop.getAuditOperations().trim().split("\\s*,\\s*");
42 for (String oper: opers){
43 AuditOperation modType =
44 convertStringToModificationType(oper);
45 Set<String> props =
46 getPropertiesForOperation(
47 modType, obj.getObjectClass());
48 props.add(prop.getPropertyName());
49 }
50 }
51 }
52 auditableObjects = null;
53 }
54
55 private AuditOperation convertStringToModificationType(String oper)
56 throws AuditableObjectRegistryException
57 {
58 try{
59 return AuditOperation.valueOf(
60 AuditOperation.class, oper.toUpperCase());
61 }catch(Exception e){
62 throw new AuditableObjectRegistryException(
63 String.format(
64 "Invalid modification operator (%s)"
65 , oper.toUpperCase())
66 , e);
67 }
68 }
69
70 private Set<String> getPropertiesForOperation(
71 AuditOperation modType, Class objectClass)
72 {
73 Map<Class, Set<String>> objects = objectProperties.get(modType);
74 if (objects==null){
75 objects = new HashMap<Class, Set<String>>();
76 objectProperties.put(modType, objects);
77 }
78 Set<String> props = objects.get(objectClass);
79 if (props==null){
80 props = new HashSet<String>();
81 objects.put(objectClass, props);
82 }
83 return props;
84 }
85
86 public void setAuditableObjects(
87 Map<Class, AuditableObject> auditableObjects)
88 {
89 this.auditableObjects = auditableObjects;
90 }
91
92 public Set<String> getAuditableObjectProperties(
93 AuditOperation modType, Class objectClass)
94 {
95 Map<Class, Set<String>> objects =
96 objectProperties==null? null : objectProperties.get(modType);
97 return objects==null? null : objects.get(objectClass);
98 }
99
100 public Set<Class> getAuditaleObjectsClasses(AuditOperation modType) {
101 Map<Class, Set<String>> objects =
102 objectProperties==null? null : objectProperties.get(modType);
103 return objects==null? null : objects.keySet();
104 }
105
106 }