Class FilePersistenceManager
- All Implemented Interfaces:
PersistenceManager
FilePersistenceManager class stores configuration data in
properties-like files inside a given directory. All configuration files are
located in the same directory.
The configuration directory is set by either the
FilePersistenceManager(String) constructor or the
FilePersistenceManager(BundleContext, String) constructor. Refer to
the respective JavaDocs for more information.
When this persistence manager is used by the Configuration Admin Service, the
location may be configured using the
ConfigurationManager bundle context
property.
If the location is not set, the config directory in the current
working directory (as set in the user.dir system property) is
used. If the the location is set but, no such directory exists, the directory
and any missing parent directories are created. If a file exists at the given
location, the constructor fails.
Configuration files are created in the configuration directory by appending
the extension .config to the PID of the configuration. The PID
is converted into a relative path name by replacing enclosed dots to slashes.
Non-symbolic-name characters in the PID are encoded with their
Unicode character code in hexadecimal.
| Examples of PID to name conversion: | |
| PID | Configuration File Name |
|---|---|
sample
| sample.config
|
org.apache.felix.log.LogService
| org/apache/felix/log/LogService.config
|
sample.fläche
| sample/fl%00e8che.config
|
Mulithreading Issues
In a multithreaded environment the store(String, Dictionary) and
load(String) methods may be called at the the quasi-same time for
the same configuration PID. It may no happen, that the store method starts
writing the file and the load method might at the same time read from the
file currently being written and thus loading corrupt data (if data is
available at all).
To prevent this situation from happening, the methods use synchronization and temporary files as follows:
- The
store(String, Dictionary)method writes a temporary file with file extension.tmp. When done, the file is renamed to actual configuration file name as implied by the PID. This last step of renaming the file is synchronized on the FilePersistenceManager instance. - The
load(String)method is completeley synchronized on the FilePersistenceManager instance such that thestore(java.lang.String, java.util.Dictionary)method might inadvertantly try to replace the file while it is being read. - Finally the
Iteratorreturned bygetDictionaries()is implemented such that any temporary configuration file is just ignored.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final StringThe default configuration data directory if no location is configured (value is "config").static final StringThe name of this persistence manager when registered in the service registry.Fields inherited from interface org.apache.felix.cm.PersistenceManager
PROPERTY_NAME -
Constructor Summary
ConstructorsConstructorDescriptionFilePersistenceManager(String location) Creates an instance of this persistence manager using the given location as the directory to store and retrieve the configuration files.FilePersistenceManager(org.osgi.framework.BundleContext bundleContext, String location) Creates an instance of this persistence manager using the given location as the directory to store and retrieve the configuration files. -
Method Summary
Modifier and TypeMethodDescriptionvoidDeletes the file for the given identifier.booleanReturnstrueif a (configuration) file exists for the given identifier.Loads configuration data from the configuration location and returns it asDictionaryobjects.Returns the directory in which the configuration files are written as aFileobject.Reads the (configuration) for the given identifier into aDictionaryobject.voidstore(String pid, Dictionary props) Stores the contents of theDictionaryin a file denoted by the given identifier.
-
Field Details
-
DEFAULT_CONFIG_DIR
The default configuration data directory if no location is configured (value is "config").- See Also:
-
DEFAULT_PERSISTENCE_MANAGER_NAME
The name of this persistence manager when registered in the service registry. (value is "file").- See Also:
-
-
Constructor Details
-
FilePersistenceManager
Creates an instance of this persistence manager using the given location as the directory to store and retrieve the configuration files.This constructor resolves the configuration file location as follows:
- If
locationisnull, theconfigdirectory in the current working directory as specified in theuser.dirsystem property is assumed. - Otherwise the named directory is used.
- If the directory name resolved in the first or second step is not an
absolute path, it is resolved to an absolute path calling the
File.getAbsoluteFile()method. - If a non-directory file exists as the location found in the previous
step or the named directory (including any parent directories) cannot be
created, an
IllegalArgumentExceptionis thrown.
This constructor is equivalent to calling
FilePersistenceManager(BundleContext, String)with anullBundleContext.- Parameters:
location- The configuration file location. If this isnulltheconfigdirectory below the current working directory is used.- Throws:
IllegalArgumentException- If thelocationexists but is not a directory or does not exist and cannot be created.
- If
-
FilePersistenceManager
Creates an instance of this persistence manager using the given location as the directory to store and retrieve the configuration files.This constructor resolves the configuration file location as follows:
- If
locationisnull, theconfigdirectory in the persistent storage area of the bundle identified bybundleContextis used. - If the framework does not support persistent storage area for bundles
in the filesystem or if
bundleContextisnull, theconfigdirectory in the current working directory as specified in theuser.dirsystem property is assumed. - Otherwise the named directory is used.
- If the directory name resolved in the first, second or third step is
not an absolute path and a
bundleContextis provided which provides access to persistent storage area, the directory name is resolved as being inside the persistent storage area. Otherwise the directory name is resolved to an absolute path calling theFile.getAbsoluteFile()method. - If a non-directory file exists as the location found in the previous
step or the named directory (including any parent directories) cannot be
created, an
IllegalArgumentExceptionis thrown.
- Parameters:
bundleContext- TheBundleContextto optionally get the data location for the configuration files. This may benull, in which case this constructor acts exactly the same as callingFilePersistenceManager(String).location- The configuration file location. If this isnulltheconfigdirectory below the current working directory is used.- Throws:
IllegalArgumentException- If the location exists but is not a directory or does not exist and cannot be created.IllegalStateException- If thebundleContextis not valid.
- If
-
-
Method Details
-
getLocation
Returns the directory in which the configuration files are written as aFileobject.- Returns:
- The configuration file location.
-
getDictionaries
Loads configuration data from the configuration location and returns it asDictionaryobjects.This method is a lazy implementation, which is just one configuration file ahead of the current enumeration location.
- Specified by:
getDictionariesin interfacePersistenceManager- Returns:
- an enumeration of configuration data returned as instances of
the
Dictionaryclass.
-
delete
Deletes the file for the given identifier.- Specified by:
deletein interfacePersistenceManager- Parameters:
pid- The identifier of the configuration file to delete.
-
exists
Returnstrueif a (configuration) file exists for the given identifier.- Specified by:
existsin interfacePersistenceManager- Parameters:
pid- The identifier of the configuration file to check.- Returns:
trueif the file exists
-
load
Reads the (configuration) for the given identifier into aDictionaryobject.- Specified by:
loadin interfacePersistenceManager- Parameters:
pid- The identifier of the configuration file to delete.- Returns:
- The configuration read from the file. This
Dictionarymay be empty if the file contains no configuration information or is not properly formatted. - Throws:
IOException- If an error occurs loading the dictionary. AnIOExceptionmust also be thrown if no dictionary exists for the given identifier.
-
store
Stores the contents of theDictionaryin a file denoted by the given identifier.- Specified by:
storein interfacePersistenceManager- Parameters:
pid- The identifier of the configuration file to which to write the configuration contents.props- The configuration data to write.- Throws:
IOException- If an error occurrs writing the configuration data.
-