// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License. Citrix Systems, Inc.
// reserves all rights not expressly granted by the License.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.hypervisor.vmware.mo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Properties;
import org.apache.log4j.Logger;
public class VmdkFileDescriptor {
private static final Logger s_logger = Logger.getLogger(VmdkFileDescriptor.class);
private Properties _properties = new Properties();
private String _baseFileName;
public VmdkFileDescriptor() {
}
public void parse(byte[] vmdkFileContent) throws IOException {
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(vmdkFileContent)));
String line;
while((line = in.readLine()) != null) {
// ignore empty and comment lines
line = line.trim();
if(line.isEmpty())
continue;
if(line.charAt(0) == '#')
continue;
String[] tokens = line.split("=");
if(tokens.length == 2) {
String name = tokens[0].trim();
String value = tokens[1].trim();
if(value.charAt(0) == '\"')
value = value.substring(1, value.length() -1);
_properties.put(name, value);
} else {
if(line.startsWith("RW")) {
int startPos = line.indexOf('\"');
int endPos = line.lastIndexOf('\"');
assert(startPos > 0);
assert(endPos > 0);
_baseFileName = line.substring(startPos + 1, endPos);
} else {
s_logger.warn("Unrecognized vmdk line content: " + line);
}
}
}
} finally {
if(in != null)
in.close();
}
}
public String getBaseFileName() {
return _baseFileName;
}
public String getParentFileName() {
return _properties.getProperty("parentFileNameHint");
}
public static byte[] changeVmdkContentBaseInfo(byte[] vmdkContent,
String baseFileName, String parentFileName) throws IOException {
assert(vmdkContent != null);
BufferedReader in = null;
BufferedWriter out = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
in = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(vmdkContent)));
out = new BufferedWriter(new OutputStreamWriter(bos));
String line;
while((line = in.readLine()) != null) {
// ignore empty and comment lines
line = line.trim();
if(line.isEmpty()) {
out.newLine();
continue;
}
if(line.charAt(0) == '#') {
out.write(line);
out.newLine();
continue;
}
String[] tokens = line.split("=");
if(tokens.length == 2) {
String name = tokens[0].trim();
String value = tokens[1].trim();
if(value.charAt(0) == '\"')
value = value.substring(1, value.length() - 1);
if(parentFileName != null && name.equals("parentFileNameHint")) {
out.write(name + "=\"" + parentFileName + "\"");
out.newLine();
} else {
out.write(line);
out.newLine();
}
} else {
if(line.startsWith("RW")) {
if(baseFileName != null) {
int startPos = line.indexOf('\"');
int endPos = line.lastIndexOf('\"');
assert(startPos > 0);
assert(endPos > 0);
// replace it with base file name
out.write(line.substring(0, startPos + 1));
out.write(baseFileName);
out.write(line.substring(endPos));
out.newLine();
} else {
out.write(line);
out.newLine();
}
} else {
s_logger.warn("Unrecognized vmdk line content: " + line);
}
}
}
} finally {
if(in != null)
in.close();
if(out != null)
out.close();
}
return bos.toByteArray();
}
}