diff --git a/core/src/com/cloud/storage/template/VhdProcessor.java b/core/src/com/cloud/storage/template/VhdProcessor.java index 875376f301b..2974c75c190 100644 --- a/core/src/com/cloud/storage/template/VhdProcessor.java +++ b/core/src/com/cloud/storage/template/VhdProcessor.java @@ -29,12 +29,10 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; -import com.cloud.exception.InternalErrorException; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.AdapterBase; -import com.cloud.utils.exception.CloudRuntimeException; /** * VhdProcessor processes the downloaded template for VHD. It @@ -54,92 +52,60 @@ public class VhdProcessor extends AdapterBase implements Processor { private byte[][] citrixCreatorApp = { {0x74, 0x61, 0x70, 0x00}, {0x43, 0x54, 0x58, 0x53}}; /*"tap ", and "CTXS"*/ @Override - public FormatInfo process(String templatePath, ImageFormat format, String templateName) throws InternalErrorException { + public FormatInfo process(String templatePath, ImageFormat format, String templateName) { if (format != null) { s_logger.debug("We currently don't handle conversion from " + format + " to VHD."); return null; } String vhdPath = templatePath + File.separator + templateName + "." + ImageFormat.VHD.getFileExtension(); - if (!_storage.exists(vhdPath)) { s_logger.debug("Unable to find the vhd file: " + vhdPath); return null; } + File vhdFile = _storage.getFile(vhdPath); + FormatInfo info = new FormatInfo(); info.format = ImageFormat.VHD; info.filename = templateName + "." + ImageFormat.VHD.getFileExtension(); - - File vhdFile = _storage.getFile(vhdPath); - info.size = _storage.getSize(vhdPath); - FileInputStream strm = null; - byte[] currentSize = new byte[8]; - byte[] creatorApp = new byte[4]; + try { - strm = new FileInputStream(vhdFile); - long skipped = strm.skip(info.size - vhdFooterSize + vhdFooterCreatorAppOffset); - if (skipped == -1) { - throw new InternalErrorException("Unexpected end-of-file"); - } - long read = strm.read(creatorApp); - if (read == -1) { - throw new InternalErrorException("Unexpected end-of-file"); - } - skipped = strm.skip(vhdFooterCurrentSizeOffset - vhdFooterCreatorVerOffset); - if (skipped == -1) { - throw new InternalErrorException("Unexpected end-of-file"); - } - read = strm.read(currentSize); - if (read == -1) { - throw new InternalErrorException("Unexpected end-of-file"); - } + info.virtualSize = getVirtualSize(vhdFile); } catch (IOException e) { - s_logger.warn("Unable to read vhd file " + vhdPath, e); - throw new InternalErrorException("Unable to read vhd file " + vhdPath + ": " + e, e); - } finally { - if (strm != null) { - try { - strm.close(); - } catch (IOException e) { - } - } + s_logger.error("Unable to get the virtual size for " + vhdPath); + return null; } - //imageSignatureCheck(creatorApp); - - long templateSize = NumbersUtil.bytesToLong(currentSize); - info.virtualSize = templateSize; - return info; } @Override - public long getVirtualSize(File file) { - FileInputStream strm = null; + public long getVirtualSize(File file) throws IOException { byte[] currentSize = new byte[8]; byte[] creatorApp = new byte[4]; - try { - strm = new FileInputStream(file); - strm.skip(file.length() - vhdFooterSize + vhdFooterCreatorAppOffset); - strm.read(creatorApp); - strm.skip(vhdFooterCurrentSizeOffset - vhdFooterCreatorVerOffset); - strm.read(currentSize); - } catch (Exception e) { - s_logger.warn("Unable to read vhd file " + file.getAbsolutePath(), e); - throw new CloudRuntimeException("Unable to read vhd file " + file.getAbsolutePath() + ": " + e); - } finally { - if (strm != null) { - try { - strm.close(); - } catch (IOException e) { - } + + try (FileInputStream strm = new FileInputStream(file)) { + long skipped = strm.skip(file.length() - vhdFooterSize + vhdFooterCreatorAppOffset); + if (skipped == -1) { + throw new IOException("Unexpected end-of-file"); + } + long read = strm.read(creatorApp); + if (read == -1) { + throw new IOException("Unexpected end-of-file"); + } + skipped = strm.skip(vhdFooterCurrentSizeOffset - vhdFooterCreatorVerOffset); + if (skipped == -1) { + throw new IOException("Unexpected end-of-file"); + } + read = strm.read(currentSize); + if (read == -1) { + throw new IOException("Unexpected end-of-file"); } } - long templateSize = NumbersUtil.bytesToLong(currentSize); - return templateSize; + return NumbersUtil.bytesToLong(currentSize); } @Override