summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/util/vm/OvfConfig.java
blob: 305507523840d30f2f7323eb4c49fe6217e20dd2 (plain) (tree)










































































































                                                                                                                                             
package org.openslx.util.vm;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import javax.xml.xpath.XPathExpressionException;

import org.apache.log4j.Logger;
import org.openslx.util.Util;
import org.openslx.util.XmlHelper;
import org.openslx.util.vm.VmMetaData.HardDisk;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;


/**
 * Class handling the parsing of a .ovf machine description file
 * For now, only used to parse the xml to get the path of the vmdk
 * from the ovf for sanity checking and cleanup after conversion.
 */
public class OvfConfig
{
    private static final Logger LOGGER = Logger.getLogger( OvfConfig.class );
    
    // key information set during initial parsing of the XML file
	private String osName = new String();
	private ArrayList<HardDisk> hddsArray = new ArrayList<HardDisk>();

	// XPath and DOM parsing related members
    private Document doc = null;
    

    public OvfConfig( File file ) throws IOException, UnsupportedVirtualizerFormatException
	{
		LOGGER.info("Entering OvfConfig class creation");
		// first validate xml
		// try {
		// 	SchemaFactory factory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
		// 	InputStream xsdStream = OvfConfig.class.getResourceAsStream( "/master-sync-shared/xml/ovf_1.1.1.xsd" );
		// 	LOGGER.info("xsdStream creation worked");
		// 	if ( xsdStream == null ) {
		// 		LOGGER.warn( "Cannot validate ovf XML: No XSD found in JAR" );
		// 	} else {
		// 		LOGGER.info("Before schema creation");
		// 		Schema schema = factory.newSchema( new StreamSource( xsdStream ) );
		// 		LOGGER.info("Created schema class");
		// 		Validator validator = schema.newValidator();
		// 		LOGGER.info("Created validator class");
		// 		validator.validate( new StreamSource( file ) );
		// 		LOGGER.info("Validated");
		// 	}
		// } catch ( SAXException e ) {
		// 	LOGGER.error( "Selected ovf file was not validated against the XSD schema: " + e.getMessage() );
		// }
		LOGGER.info("XSD validation worked.");
		// valid xml, try to create the DOM
		doc = XmlHelper.parseDocumentFromStream( new FileInputStream( file ) );
		doc = XmlHelper.removeFormattingNodes( doc );
		if ( doc == null )
			throw new UnsupportedVirtualizerFormatException( "Could not create DOM from given ovf machine configuration file!" );
		LOGGER.info("DOM creation worked");
		init();
    }
    
    /**
	 * Main initialization functions parsing the document created during the constructor.
	 * @throws UnsupportedVirtualizerFormatException 
	 */
	private void init() throws UnsupportedVirtualizerFormatException
	{
		LOGGER.info("Entering OvfConfig init");
		if ( Util.isEmptyString( getDisplayName() ) ) {
			throw new UnsupportedVirtualizerFormatException( "Machine doesn't have a name" );
		}
		LOGGER.info( getDisplayName() );
		// try {

		// 	setHdds();
		// } catch ( XPathExpressionException e ) {
		// 	LOGGER.debug( "Could not initialize VBoxConfig", e );
		// 	return;
		// }
    }
    
    	/**
	 * Getter for the display name
	 *
	 * @return the display name of this VM
	 */
	public String getDisplayName()
	{
		try {
			return XmlHelper.XPath.compile( "/Envelope/VirtualSystem/Name" ).evaluate( this.doc );
		} catch ( XPathExpressionException e ) {
			return "";
		}
	}

}