/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.configuration;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
/**
* A part (or all) of the managed hierarchical configuration data.
*
* @author Robert Mischke
*/
public interface ConfigurationSegment {
/**
* Fetches a part of the current configuration segment, as defined by the relative path argument. For example, if the current segment is
* "network", calling this method with "ipFilter" will result the segment for the "network/ipFilter" path. Multiple path levels can be
* concatenated with slashes.
* <p>
* If no entry/segment exists at the given path, this method will still return a {@link ConfigurationSegment}, but that instance will
* return <code>false</code> on calls to {@link #isPresentInCurrentConfiguration()}.
*
* @param relativePath the path relative to the current one to fetch
* @return the requested {@link ConfigurationSegment}
*/
ConfigurationSegment getSubSegment(String relativePath);
/**
* @param relativePath the path relative to the current one to fetch
* @return the value of the given relativ path, or null if no such value exists
* @throws ConfigurationException on failure.
*/
List<String> getStringArray(String relativePath) throws ConfigurationException;
/**
* Fetches a part of the current configuration segment, as defined by the relative path argument. For example, if the current segment is
* "network", calling this method with "ipFilter" will result the segment for the "network/ipFilter" path. Multiple path levels can be
* concatenated with slashes.
* <p>
* If no entry/segment exists at the given path, this method will create the missing elements as needed. The returned
* {@link WritableConfigurationSegment} can then be used to edit the properties or elements of that segment. Note that the current
* segment must already exist; otherwise, an {@link IOException} is thrown.
*
* @param relativePath the path relative to the current one to fetch
* @return the requested {@link ConfigurationSegment}
* @throws ConfigurationException if the current segment does not actually exist, or if an error occurs while adding the elements
*/
WritableConfigurationSegment getOrCreateWritableSubSegment(String relativePath) throws ConfigurationException;
/**
* @param relativePath the value's relative path to the current segment
* @return the value at the given relative path, or null if no such value exists
*/
String getString(String relativePath);
/**
* @param relativePath the value's relative path to the current segment
* @param defaultValue the default value to return
* @return the value at the given relative path, or the given default if no such value exists
*/
String getString(String relativePath, String defaultValue);
/**
* @param relativePath the value's relative path to the current segment
* @return the value at the given relative path, or null if no such value exists or if it cannot be parsed
*/
Long getLong(String relativePath);
/**
* @param relativePath the value's relative path to the current segment
* @param defaultValue the default value to return
* @return the value at the given relative path, or the given default if no such value exists or if it cannot be parsed
*/
Long getLong(String relativePath, Long defaultValue);
/**
* @param relativePath the value's relative path to the current segment
* @return the value at the given relative path, or null if no such value exists
*/
Integer getInteger(String relativePath);
/**
* @param relativePath the value's relative path to the current segment
* @param defaultValue the default value to return
* @return the value at the given relative path, or the given default if no such value exists
*/
Integer getInteger(String relativePath, Integer defaultValue);
/**
* @param relativePath the value's relative path to the current segment
* @return the value at the given relative path, or null if no such value exists
*/
Double getDouble(String relativePath);
/**
* @param relativePath the value's relative path to the current segment
* @param defaultValue the default value to return
* @return the value at the given relative path, or the given default if no such value exists
*/
Double getDouble(String relativePath, Double defaultValue);
/**
* @param relativePath the value's relative path to the current segment
* @return the value at the given relative path, or null if no such value exists
*/
Boolean getBoolean(String relativePath);
/**
* @param relativePath the value's relative path to the current segment
* @param defaultValue the default value to return
* @return the value at the given relative path, or the given default if no such value exists
*/
Boolean getBoolean(String relativePath, Boolean defaultValue);
/**
* Returns true if the current segment exists in the configuration it was created from. THe root segment will return true as long as the
* underlying storage (typically a file) exists. Sub-segments will return true if the path used to create them from actually points to
* an entry/segment in the configuration hierarchy.
*
* @return true if the current segment exists in the configuration it was created from
*/
boolean isPresentInCurrentConfiguration();
// List<String> getStringArray(String relativePath);
// ConfigurationSegment getElement(String relativePath, String id);
/**
* Lists all JSON field-value pairs at the given location, with each value part mapped as a {@link ConfigurationSegment}. For
* convenience in typical configuration scenarios, using this method on a non-existing path returns an empty list, just as if the path
* existed with no entries.
*
* @param relativePath the relative path to the current segment to read
* @return the map of field names to configuration sub-segments
*/
Map<String, ConfigurationSegment> listElements(String relativePath);
/**
* Maps the given segment to an instance of the given bean class. See {@link ObjectMapper} for mapping details.
*
* @param <T> the bean class to map to
* @param clazz the bean class to map to
* @return the mapped object
* @throws IOException on parsing or mapping errors
*/
<T> T mapToObject(Class<T> clazz) throws IOException;
}