View Javadoc

1   
2   /*
3    * AuditableObjectRegistryImpl.java
4    * Created on 28 Август 2006 г., 23:55
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 }