View Javadoc

1   
2   package org.weda.store.impl;
3   
4   import java.util.HashMap;
5   import java.util.Map;
6   import org.apache.commons.lang.ObjectUtils;
7   import org.apache.hivemind.util.Defense;
8   import org.weda.property.PropertyValue;
9   import org.weda.property.PropertyValueException;
10  
11  /**Цель: чтение/редактирование свойств о множества объектов одного класса
12   *
13   * @author tim
14   */
15  public class ObjectSet {
16      private Object[] objects;
17      private Class objectClass;
18      private PropertyValue propertyValue;
19      private Map<String, Boolean> uniqueFlag = new HashMap<String, Boolean>();
20      
21      public ObjectSet(Class objectClass, Object[] objects
22                          , PropertyValue propertyValue) 
23          throws ObjectSetException 
24      {
25          if (objects==null || objects.length==0)
26              throw new ObjectSetException(
27                      "Parameter objects can not be null or empty");
28          this.objects = objects;
29          if (objectClass==null)
30              throw new ObjectSetException(
31                      "Parameter objectClass can not be null");
32          this.objectClass=objectClass;
33          if (propertyValue==null)
34              throw new ObjectSetException(
35                      "Parameter propertyValue can not be null");
36          this.propertyValue=propertyValue;
37      }
38      
39      public Class getBaseClass(){
40          return objects[0].getClass();
41      }
42      
43      /**Метод возвращает объекты множества
44       */
45      public Object[] getObjects(){
46          return objects;
47      }
48      
49      /**Метод устанавливает значение свойства для группы объектов.
50       */
51      public void setValue(String propertyPath, Object value)
52          throws ObjectSetException
53      {
54          try{
55              Integer propId=propertyValue.compileSetter(objectClass, propertyPath);
56              for (Object obj: objects)
57                  propertyValue.setValue(obj, propId, value);
58              uniqueFlag.put(propertyPath, true);
59          }catch(PropertyValueException e){
60              throw new ObjectSetException(
61                      String.format(
62                          "Can't set value (%s) for object set property (%s)"
63                         , propertyPath, value));
64          }
65          
66      }
67      
68      /**Метод возврщает значение для группы объектов.
69       *@return значения свойства если все значения заданного свойства в группе 
70       *        объектов одинаковые, иначе <code>null</code>
71       *@see #setValue(String, Object)
72       *@see #isValueUnique(String)
73       */
74      public Object getValue(String propertyPath) throws ObjectSetException {
75          if (isValueUnique(propertyPath)) {
76              try{
77                  Integer propId=propertyValue.compileGetter(
78                          objectClass, propertyPath);
79                  return propertyValue.getValue(objects[0], propId);
80              }catch(PropertyValueException e){
81                  throw new ObjectSetException (
82                          "Can't get value for property set.", e);
83              }
84          }
85          return null;
86      }
87      
88      /**Метод вернет <code>true</code> если все значения указанного свойства
89       * в группе объектов одинаковые.
90       */
91      public boolean isValueUnique(String propertyPath) 
92          throws ObjectSetException 
93      {
94          if (uniqueFlag.containsKey(propertyPath))
95              return uniqueFlag.get(propertyPath);
96          else{
97              boolean unique=true;
98              if (objects.length!=1){
99                  try{
100                     Integer propId=propertyValue.compileGetter(
101                             objectClass, propertyPath);
102                     Object val=propertyValue.getValue(objects[0], propId);
103                     for (int i=1; i<objects.length; ++i){
104                         Object nextVal=propertyValue.getValue(
105                                 objects[i], propId);
106                         if (!ObjectUtils.equals(val, nextVal)){
107                             unique=false;
108                             break;
109                         }
110                     }
111                 }catch(PropertyValueException  e){
112                     throw new ObjectSetException (
113                             String.format(
114                                 "Can't detect property value uniqueness " +
115                                 "for property (%s)", propertyPath)
116                           , e);
117                 }
118             }
119             uniqueFlag.put(propertyPath, unique);
120             return unique;
121         }
122     }
123 }