16
16
import java .io .OutputStreamWriter ;
17
17
import java .util .HashSet ;
18
18
import java .util .Set ;
19
+ import java .util .UUID ;
19
20
20
21
import org .slf4j .Logger ;
21
22
import org .slf4j .LoggerFactory ;
27
28
import com .zsmartsystems .zigbee .database .ZclAttributeDao ;
28
29
import com .zsmartsystems .zigbee .database .ZclClusterDao ;
29
30
import com .zsmartsystems .zigbee .database .ZigBeeEndpointDao ;
31
+ import com .zsmartsystems .zigbee .database .ZigBeeNetworkBackupDao ;
30
32
import com .zsmartsystems .zigbee .database .ZigBeeNetworkDataStore ;
31
33
import com .zsmartsystems .zigbee .database .ZigBeeNodeDao ;
32
34
import com .zsmartsystems .zigbee .security .ZigBeeKey ;
@@ -47,19 +49,25 @@ public class ZigBeeDataStore implements ZigBeeNetworkDataStore {
47
49
*/
48
50
private final static Logger logger = LoggerFactory .getLogger (ZigBeeDataStore .class );
49
51
52
+ private final static String CHARSET = "UTF-8" ;
53
+ private final static String DATABASE = "database/" ;
50
54
private final static String KEYSTORE = "keystore" ;
55
+ private final static String BACKUP = "backup" ;
51
56
52
57
private final String networkId ;
53
58
54
59
public ZigBeeDataStore (String networkId ) {
55
- this .networkId = "database/" + networkId + "/" ;
56
- File file = new File (this .networkId + "/" + KEYSTORE );
57
- if (file .exists ()) {
58
- return ;
59
- }
60
- if (!file .mkdirs ()) {
60
+ this .networkId = DATABASE + networkId + "/" ;
61
+ File file ;
62
+
63
+ file = new File (this .networkId + "/" + KEYSTORE );
64
+ if (!file .exists () && !file .mkdirs ()) {
61
65
logger .error ("Error creating network database folder {}" , file );
62
66
}
67
+ file = new File (DATABASE + BACKUP );
68
+ if (!file .exists () && !file .mkdirs ()) {
69
+ logger .error ("Error creating network backup folder {}" , file );
70
+ }
63
71
}
64
72
65
73
private XStream openStream () {
@@ -99,6 +107,10 @@ private File getFile(IeeeAddress address) {
99
107
return new File (networkId + address + ".xml" );
100
108
}
101
109
110
+ private File getFile (UUID uuid ) {
111
+ return new File (DATABASE + BACKUP + "/" + uuid + ".xml" );
112
+ }
113
+
102
114
private File getFile (String key ) {
103
115
return new File (networkId + KEYSTORE + "/" + key + ".xml" );
104
116
}
@@ -135,10 +147,9 @@ public ZigBeeNodeDao readNode(IeeeAddress address) {
135
147
File file = getFile (address );
136
148
137
149
ZigBeeNodeDao node = null ;
138
- try (BufferedReader reader = new BufferedReader (new InputStreamReader (new FileInputStream (file ), "UTF-8" ))) {
150
+ try (BufferedReader reader = new BufferedReader (new InputStreamReader (new FileInputStream (file ), CHARSET ))) {
139
151
node = (ZigBeeNodeDao ) stream .fromXML (reader );
140
152
reader .close ();
141
- logger .info ("{}: ZigBee reading network state complete." , address );
142
153
} catch (Exception e ) {
143
154
logger .error ("{}: Error reading network state: " , address , e );
144
155
}
@@ -151,10 +162,9 @@ public void writeNode(ZigBeeNodeDao node) {
151
162
XStream stream = openStream ();
152
163
File file = getFile (node .getIeeeAddress ());
153
164
154
- try (BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (file ), "UTF-8" ))) {
165
+ try (BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (file ), CHARSET ))) {
155
166
stream .marshal (node , new PrettyPrintWriter (writer ));
156
167
writer .close ();
157
- logger .info ("{}: ZigBee saving network state complete." , node .getIeeeAddress ());
158
168
} catch (Exception e ) {
159
169
logger .error ("{}: Error writing network state: " , node .getIeeeAddress (), e );
160
170
}
@@ -173,10 +183,9 @@ public void writeObject(String key, Object object) {
173
183
XStream stream = openStream ();
174
184
File file = getFile (key );
175
185
176
- try (BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (file ), "UTF-8" ))) {
186
+ try (BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (file ), CHARSET ))) {
177
187
stream .marshal (object , new PrettyPrintWriter (writer ));
178
188
writer .close ();
179
- logger .info ("{}: ZigBee saving key complete." , key );
180
189
} catch (Exception e ) {
181
190
logger .error ("{}: Error writing key: " , key , e );
182
191
}
@@ -187,4 +196,67 @@ public Object readObject(String key) {
187
196
return null ;
188
197
}
189
198
199
+ @ Override
200
+ public boolean writeBackup (ZigBeeNetworkBackupDao backup ) {
201
+ XStream stream = openStream ();
202
+ File file = getFile (backup .getUuid ());
203
+
204
+ try (BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (file ), CHARSET ))) {
205
+ stream .marshal (backup , new PrettyPrintWriter (writer ));
206
+ writer .close ();
207
+ } catch (Exception e ) {
208
+ logger .error ("{}: Error writing network backup: " , backup .getUuid (), e );
209
+ return false ;
210
+ }
211
+
212
+ return true ;
213
+ }
214
+
215
+ @ Override
216
+ public ZigBeeNetworkBackupDao readBackup (UUID uuid ) {
217
+ XStream stream = openStream ();
218
+ File file = getFile (uuid );
219
+
220
+ ZigBeeNetworkBackupDao backup = null ;
221
+ try (BufferedReader reader = new BufferedReader (new InputStreamReader (new FileInputStream (file ), CHARSET ))) {
222
+ backup = (ZigBeeNetworkBackupDao ) stream .fromXML (reader );
223
+ reader .close ();
224
+ } catch (Exception e ) {
225
+ logger .error ("{}: Error reading network backup: " , uuid , e );
226
+ }
227
+
228
+ return backup ;
229
+ }
230
+
231
+ @ Override
232
+ public Set <ZigBeeNetworkBackupDao > listBackups () {
233
+ Set <ZigBeeNetworkBackupDao > backups = new HashSet <>();
234
+ File dir = new File (DATABASE + BACKUP );
235
+ File [] files = dir .listFiles ();
236
+
237
+ if (files == null ) {
238
+ return backups ;
239
+ }
240
+
241
+ for (File file : files ) {
242
+ if (!file .getName ().toLowerCase ().endsWith (".xml" )) {
243
+ continue ;
244
+ }
245
+
246
+ try {
247
+ String filename = file .getName ();
248
+ UUID uuid = UUID .fromString (filename .substring (0 , filename .length () - 4 ));
249
+ ZigBeeNetworkBackupDao backup = readBackup (uuid );
250
+ for (ZigBeeNodeDao node : backup .getNodes ()) {
251
+ node .setEndpoints (null );
252
+ node .setBindingTable (null );
253
+ }
254
+ backups .add (backup );
255
+ } catch (IllegalArgumentException e ) {
256
+ logger .error ("Error parsing database filename: {}" , file .getName ());
257
+ }
258
+ }
259
+
260
+ return backups ;
261
+ }
190
262
}
0 commit comments