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;
16 import java.io.IOException;
17 import java.util.Collections;
18 import java.util.List;
19 import java.util.SortedSet;
20 import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
21 import org.opendaylight.controller.config.persist.api.Persister;
22 import org.opendaylight.controller.config.persist.api.PropertiesProvider;
23 import org.opendaylight.controller.config.persist.api.StorageAdapter;
24 import org.opendaylight.controller.config.persist.storage.file.xml.model.Config;
25 import org.opendaylight.controller.config.persist.storage.file.xml.model.ConfigSnapshot;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
30 * StorageAdapter that stores configuration in an xml file.
32 public class XmlFileStorageAdapter implements StorageAdapter, Persister {
33 private static final Logger LOG = LoggerFactory.getLogger(XmlFileStorageAdapter.class);
35 public static final String FILE_STORAGE_PROP = "fileStorage";
36 public static final String NUMBER_OF_BACKUPS = "numberOfBackups";
38 private static Integer numberOfStoredBackups;
42 public Persister instantiate(PropertiesProvider propertiesProvider) {
43 File storage = extractStorageFileFromProperties(propertiesProvider);
44 LOG.debug("Using file {}", storage.getAbsolutePath());
45 // Create file if it does not exist
46 File parentFile = storage.getAbsoluteFile().getParentFile();
47 if (parentFile.exists() == false) {
48 LOG.debug("Creating parent folders {}", parentFile);
51 if (storage.exists() == false) {
52 LOG.debug("Storage file does not exist, creating empty file");
54 boolean result = storage.createNewFile();
55 if (result == false) {
56 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 LOG.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();
121 public ConfigSnapshotHolder toConfigSnapshot(final ConfigSnapshot configSnapshot) {
122 return new ConfigSnapshotHolder() {
124 public String getConfigSnapshot() {
125 return configSnapshot.getConfigSnapshot();
129 public SortedSet<String> getCapabilities() {
130 return configSnapshot.getCapabilities();
134 public String toString() {
135 return configSnapshot.toString();
141 public void close() {
146 public String toString() {
147 return "XmlFileStorageAdapter [storage=" + storage + "]";