2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.config.persist.storage.file.xml;
11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.base.Optional;
13 import com.google.common.base.Preconditions;
14 import com.google.common.collect.Lists;
15 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
16 import org.opendaylight.controller.config.persist.api.Persister;
17 import org.opendaylight.controller.config.persist.api.PropertiesProvider;
18 import org.opendaylight.controller.config.persist.api.StorageAdapter;
19 import org.opendaylight.controller.config.persist.storage.file.xml.model.Config;
20 import org.opendaylight.controller.config.persist.storage.file.xml.model.ConfigSnapshot;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
25 import java.io.IOException;
26 import java.util.Collections;
27 import java.util.List;
28 import java.util.SortedSet;
31 * StorageAdapter that stores configuration in an xml file.
33 public class XmlFileStorageAdapter implements StorageAdapter, Persister {
34 private static final Logger logger = LoggerFactory.getLogger(XmlFileStorageAdapter.class);
36 public static final String FILE_STORAGE_PROP = "fileStorage";
37 public static final String NUMBER_OF_BACKUPS = "numberOfBackups";
39 private static Integer numberOfStoredBackups;
43 public Persister instantiate(PropertiesProvider propertiesProvider) {
44 File storage = extractStorageFileFromProperties(propertiesProvider);
45 logger.debug("Using file {}", storage.getAbsolutePath());
46 // Create file if it does not exist
47 File parentFile = storage.getAbsoluteFile().getParentFile();
48 if (parentFile.exists() == false) {
49 logger.debug("Creating parent folders {}", parentFile);
52 if (storage.exists() == false) {
53 logger.debug("Storage file does not exist, creating empty file");
55 boolean result = storage.createNewFile();
57 throw new RuntimeException("Unable to create storage file " + storage);
58 } catch (IOException e) {
59 throw new RuntimeException("Unable to create storage file " + storage, e);
62 if (numberOfStoredBackups == 0) {
63 throw new RuntimeException(NUMBER_OF_BACKUPS
64 + " property should be either set to positive value, or ommited. Can not be set to 0.");
66 setFileStorage(storage);
71 public void setFileStorage(File storage) {
72 this.storage = storage;
76 public void setNumberOfBackups(Integer numberOfBackups) {
77 numberOfStoredBackups = numberOfBackups;
80 private static File extractStorageFileFromProperties(PropertiesProvider propertiesProvider) {
81 String fileStorageProperty = propertiesProvider.getProperty(FILE_STORAGE_PROP);
82 Preconditions.checkNotNull(fileStorageProperty, "Unable to find " + propertiesProvider.getFullKeyForReporting(FILE_STORAGE_PROP));
83 File result = new File(fileStorageProperty);
84 String numberOfBackupsAsString = propertiesProvider.getProperty(NUMBER_OF_BACKUPS);
85 if (numberOfBackupsAsString != null) {
86 numberOfStoredBackups = Integer.valueOf(numberOfBackupsAsString);
88 numberOfStoredBackups = Integer.MAX_VALUE;
90 logger.trace("Property {} set to {}", NUMBER_OF_BACKUPS, numberOfStoredBackups);
95 public void persistConfig(ConfigSnapshotHolder holder) throws IOException {
96 Preconditions.checkNotNull(storage, "Storage file is null");
98 Config cfg = Config.fromXml(storage);
99 cfg.addConfigSnapshot(ConfigSnapshot.fromConfigSnapshot(holder), numberOfStoredBackups);
104 public List<ConfigSnapshotHolder> loadLastConfigs() throws IOException {
105 Preconditions.checkNotNull(storage, "Storage file is null");
107 if (!storage.exists()) {
108 return Collections.emptyList();
111 Optional<ConfigSnapshot> lastSnapshot = Config.fromXml(storage).getLastSnapshot();
113 if (lastSnapshot.isPresent())
114 return Lists.newArrayList(toConfigSnapshot(lastSnapshot.get()));
116 return Collections.emptyList();
120 public ConfigSnapshotHolder toConfigSnapshot(final ConfigSnapshot configSnapshot) {
121 return new ConfigSnapshotHolder() {
123 public String getConfigSnapshot() {
124 return configSnapshot.getConfigSnapshot();
128 public SortedSet<String> getCapabilities() {
129 return configSnapshot.getCapabilities();
133 public String toString() {
134 return configSnapshot.toString();
140 public void close() {
145 public String toString() {
146 return "XmlFileStorageAdapter [storage=" + storage + "]";