package org.openslx.libvirt.domain.device;
import org.openslx.libvirt.xml.LibvirtXmlNode;
/**
* A file system device node in a Libvirt domain XML document.
*
* @author Manuel Bentele
* @version 1.0
*/
public class FileSystem extends Device
{
/**
* Creates an empty file system device.
*/
public FileSystem()
{
super();
}
/**
* Creates a file system device representing an existing Libvirt XML file system device element.
*
* @param xmlNode existing Libvirt XML file system device element.
*/
public FileSystem( LibvirtXmlNode xmlNode )
{
super( xmlNode );
}
/**
* Returns access mode of the file system device.
*
* @return access mode of the file system device.
*/
public AccessMode getAccessMode()
{
final String mode = this.getXmlElementAttributeValue( "accessmode" );
return AccessMode.fromString( mode );
}
/**
* Sets access mode for the file system device.
*
* @param mode access mode for the file system device.
*/
public void setAccessMode( AccessMode mode )
{
this.setXmlElementAttributeValue( "accessmode", mode.toString() );
}
/**
* Returns type of the file system device.
*
* @return type of the file system device.
*/
public Type getType()
{
final String type = this.getXmlElementAttributeValue( "type" );
return Type.fromString( type );
}
/**
* Sets type for the file system device.
*
* @param type type for the file system device.
*/
public void setType( Type type )
{
this.setXmlElementAttributeValue( "type", type.toString() );
}
/**
* Returns source of the file system device.
*
* @return source of the file system device.
*/
public String getSource()
{
final Type type = this.getType();
String source = null;
switch ( type ) {
case BIND:
source = this.getXmlElementAttributeValue( "source", "dir" );
break;
case BLOCK:
source = this.getXmlElementAttributeValue( "source", "dev" );
break;
case FILE:
source = this.getXmlElementAttributeValue( "source", "file" );
break;
case MOUNT:
source = this.getXmlElementAttributeValue( "source", "dir" );
break;
case RAM:
source = this.getXmlElementAttributeValue( "source", "usage" );
break;
case TEMPLATE:
source = this.getXmlElementAttributeValue( "source", "name" );
break;
}
return source;
}
/**
* Sets source for the file system device.
*
* @param source source for the file system device.
*/
public void setSource( String source )
{
Type type = this.getType();
// remove all attributes from sub-element 'source'
this.removeXmlElementAttributes( "source" );
switch ( type ) {
case BIND:
this.setXmlElementAttributeValue( "source", "dir", source );
break;
case BLOCK:
this.setXmlElementAttributeValue( "source", "dev", source );
break;
case FILE:
this.setXmlElementAttributeValue( "source", "file", source );
break;
case MOUNT:
this.setXmlElementAttributeValue( "source", "dir", source );
break;
case RAM:
this.setXmlElementAttributeValue( "source", "usage", source );
break;
case TEMPLATE:
this.setXmlElementAttributeValue( "source", "name", source );
break;
}
}
/**
* Returns target of the file system device.
*
* @return target of the file system device.
*/
public String getTarget()
{
return this.getXmlElementAttributeValue( "target", "dir" );
}
/**
* Sets target for the file system device.
*
* @param target target for the file system device.
*/
public void setTarget( String target )
{
this.setXmlElementAttributeValue( "target", "dir", target );
}
/**
* Creates a non-existent file system device as Libvirt XML device element.
*
* @param xmlNode Libvirt XML node of the Libvirt XML device that is created.
* @return created file system device instance.
*/
public static FileSystem createInstance( LibvirtXmlNode xmlNode )
{
return FileSystem.newInstance( xmlNode );
}
/**
* Creates a file system device representing an existing Libvirt XML file system device element.
*
* @param xmlNode existing Libvirt XML file system device element.
* @return file system device instance.
*/
public static FileSystem newInstance( LibvirtXmlNode xmlNode )
{
return new FileSystem( xmlNode );
}
/**
* Access mode for the file system device.
*
* @author Manuel Bentele
* @version 1.0
*/
public enum AccessMode
{
// @formatter:off
PASSTHROUGH( "passthrough" ),
MAPPED ( "mapped" ),
SQUASH ( "squash" );
// @formatter:on
/**
* Name of the file system device access mode.
*/
private String mode;
/**
* Creates file system device access mode.
*
* @param mode valid name of the file system device access mode in a Libvirt domain XML
* document.
*/
AccessMode( String mode )
{
this.mode = mode;
}
@Override
public String toString()
{
return this.mode;
}
/**
* Creates file system device access mode from its name with error check.
*
* @param mode name of the file system device access mode in a Libvirt domain XML document.
* @return valid file system device access mode.
*/
public static AccessMode fromString( String mode )
{
for ( AccessMode a : AccessMode.values() ) {
if ( a.mode.equalsIgnoreCase( mode ) ) {
return a;
}
}
return null;
}
}
/**
* Type of file system device.
*
* @author Manuel Bentele
* @version 1.0
*/
public enum Type
{
// @formatter:off
MOUNT ( "mount" ),
TEMPLATE( "template" ),
FILE ( "file" ),
BLOCK ( "block" ),
RAM ( "ram" ),
BIND ( "bind" );
// @formatter:on
/**
* Name of the file system device type.
*/
private String type;
/**
* Creates file system device type.
*
* @param type valid name of the file system device type in a Libvirt domain XML document.
*/
Type( String type )
{
this.type = type;
}
@Override
public String toString()
{
return this.type;
}
/**
* Creates file system device type from its name with error check.
*
* @param type name of the file system device type in a Libvirt domain XML document.
* @return valid file system device type.
*/
public static Type fromString( String type )
{
for ( Type t : Type.values() ) {
if ( t.type.equalsIgnoreCase( type ) ) {
return t;
}
}
return null;
}
}
}