Metadata support for entities is defined by the ECMetadata and the ECNamedMetadata capability interfaces. ECMetadata uses a single metadata container for each entity, while ECNamedMetadata supports any number of named metadata containers per entity. Each named metadata container is identified by a name that is unique for the entity that it is associated with. A metadata container is represented as a ReadWritableFile.
There are two file system capabilities that indicate that a file system supports metadata; FSCMetadata and FSCDirectoryMetadata. FSCMetadata indicate metadata support for all entity types, while FSCDirectoryMetadata indicate metadata support for directory entities only. All file systems that support FSCMetadata also support FSCDirectoryMetadata.
Two capability providers provide metadata support:
Table 11.1. Metadata capability providers
Capability provider | Adds capabilities | Description |
---|---|---|
FileBasedDirectoryMetadataCapabilityProvider | FSCDirectoryMetadata ECMetadata (for directories) ECNamedMetadata (for directories) | Provides metadata support for directory entities. Metadata is stored in invisible files in the directory. This capability provider does not modify the backing file system in the way that FileBasedMetadataCapabilityProvider do. |
FileBasedMetadataCapabilityProvider | FSCMetadata FSCDirectoryMetadata ECMetadata ECNamedMetadata | Provides metadata support for all entity types. This capability provider transparently changes the file system layout in the backing file system. |
If the file system that the metadata capability is added to is FSCPersistent, the metadata will also be persistent.
When copying entities with metadata to a file system that does not support
metadata, the metatada capability provider's MetadataCopyStrategy
determines what happens. If it is set to IGNORE
,
which is the default, metadata will not be copied. If it is set to
COPY
, metadata is copied and put in one or
several separate files in the target file system.
ECMetadataUtil and ECNamedMetadataUtil contain static utility methods for working with metadata capabilities.
Example 11.1. Creating a metadata enabled file system
FileSystem fs = new FSRWFileSystemBuilder(). setRoot(new File("/tmp/fs1")). addCapabilityProvider( new FileBasedMetadataCapabilityProvider(). // Put metadata in separate files if copying entities to a metadata // unaware file system. setCopyStrategy(MetadataCopyStrategy.COPY)). create();
Example 11.2. Creating a file system with metadata support for directories
FileSystem fs = new FSRWFileSystemBuilder(). setRoot(new File("/tmp/fs1")). addCapabilityProvider( new FileBasedDirectoryMetadataCapabilityProvider(). // Don't copy metadata if copying directories with metadata to a file // system that does not support metadata. setCopyStrategy(MetadataCopyStrategy.IGNORE)). create();
Example 11.3. Setting a metadata property on an entity
// a is an entity (file or directory) EntityLock wl = a.lockForWriting(); try { Properties p = new FileBackedProperties( ECMetadataUtil.getCapability(a)); p.putStringValue( "lastSeen", new SimpleDateFormat("yyyyMMdd").format(new Date())); } finally { wl.unlock(); }
Example 11.4. Reading data from a named metadata file
// a is an entity (file or directory) EntityLock rl = a.lockForReading(); try { // The metadata file is protected by it's parent entity's read lock InputStream is = ECNamedMetadataUtil.getMetadataFile(a, "icon64x64.bmp"). openForRead(); try { BufferedImage img = ImageIO.read(is); } finally { is.close(); } } finally { rl.unlock(); }