View Javadoc

1   package org.ximtec.igesture.storage;
2   
3   import java.io.File;
4   import java.util.ArrayList;
5   import java.util.HashMap;
6   import java.util.List;
7   
8   import org.ximtec.igesture.core.DataObject;
9   
10  public abstract class DefaultFileStorageEngine extends DefaultStorageEngine {
11  
12    private File storageFile;
13    private boolean doChanged;
14  
15    private HashMap<Class<? extends DataObject>, List<DataObject>> dataObjects;
16  
17    /**
18     * Constructor
19     * @param file
20     */
21    public DefaultFileStorageEngine(File file) {
22      this.storageFile = file;
23      dataObjects = deserialize(storageFile);
24      
25     
26  
27      setDoChanged(false);
28    }
29  
30    /**
31     * Adds a data object to the object container.
32     * 
33     * @param dataObject
34     *          the data object to be added.
35     */
36    private void addDataObject(DataObject dataObject) {
37      // create a list for a specific type if it doesn't exist
38      if (dataObjects.get(dataObject.getClass()) == null) {
39        dataObjects.put(dataObject.getClass(), new ArrayList<DataObject>());
40      }
41  
42      // only add dataObject if it isn't already present in the list
43      if (!dataObjects.get(dataObject.getClass()).contains(dataObject)) {
44        dataObjects.get(dataObject.getClass()).add(dataObject);
45      }
46  
47    } // addDataObject
48    
49  
50  
51    @Override
52    public void commit() {
53      serialize(dataObjects, getStorageFile());
54  
55    }
56  
57    /**
58     * Deserializes the objects
59     * 
60     * @param storageFile
61     * @return
62     */
63    protected abstract HashMap<Class<? extends DataObject>, List<DataObject>> deserialize(File storageFile);
64  
65    @Override
66    public void dispose() {
67      //
68    } // dispose
69  
70    public File getStorageFile() {
71      return storageFile;
72    }
73  
74    @SuppressWarnings("unchecked")
75    public <T extends DataObject> List<T> load(Class<T> clazz) {
76      if (dataObjects.get(clazz) != null) {
77        return new ArrayList<T>((List<T>) dataObjects.get(clazz));
78      }
79  
80      return new ArrayList<T>();
81    } // load
82    
83  
84    /*
85     * (non-Javadoc)
86     * 
87     * @see org.ximtec.igesture.storage.StorageEngine#load(java.lang.Class,
88     * java.lang.String)
89     */
90    public <T extends DataObject> T load(final Class<T> clazz, final String id) {
91      T dataObject = null;
92  
93      if (dataObjects.get(clazz) != null) {
94  
95        for (final DataObject tmp : dataObjects.get(clazz)) {
96  
97          if (tmp.getId().equals(id)) {
98            dataObject = clazz.cast(tmp);
99            break;
100         }
101       }
102     }
103 
104     return dataObject;
105   } // load
106 
107   @Override
108   public void remove(DataObject dataObject) {
109     removeDataObject(dataObject);
110     setDoChanged(true);
111   } // remove
112 
113   /**
114    * Removes a data object from the object container.
115    * 
116    * @param dataObject
117    *          the data object to be removed.
118    */
119   protected void removeDataObject(DataObject dataObject) {
120     if (dataObjects.get(dataObject.getClass()) != null) {
121       dataObjects.get(dataObject.getClass()).remove(dataObject);
122     }
123   } // removeDataObject
124 
125   /**
126    * Serializes the data objects.
127    * 
128    * @param objects
129    * @param file
130    */
131   protected abstract void serialize(HashMap<Class<? extends DataObject>, List<DataObject>> objects, File file);
132 
133   public void setStorageFile(File storageFile) {
134     this.storageFile = storageFile;
135   }
136 
137   @Override
138   public synchronized void store(DataObject dataObject) {
139     addDataObject(dataObject);
140     setDoChanged(true);
141   } // store
142 
143   @Override
144   public void update(DataObject dataObject) {
145     addDataObject(dataObject);
146     setDoChanged(true);
147   } // update
148 
149   /**
150    * Sets the flag indicating if the data model has changed since the last
151    * storage/load operation.
152    * 
153    * @param doChanged
154    */
155   protected void setDoChanged(boolean doChanged) {
156     this.doChanged = doChanged;
157   }
158 
159   /**
160    * Returns true, if the data model has changed since the last storage/load
161    * operation.
162    * 
163    * @return true if the data model has changed.
164    */
165   protected boolean isDoChanged() {
166     return doChanged;
167   }
168  
169 }