package betsy.bpel.virtual.host.virtualbox;
import betsy.common.config.Configuration;
import org.apache.log4j.Logger;
import org.virtualbox_4_2.IVirtualBox;
import org.virtualbox_4_2.VirtualBoxManager;
/**
* The {@link VBoxConnector} establishes the connection between betsy and
* VirtualBox. It also provides objects that should be created only once per
* connection, such as the {@link VirtualBoxManager} or the
* {@link VBoxApplianceImporter}.
*
* @author Cedric Roeck
* @version 1.0
*/
class VBoxConnector {
private static final Logger log = Logger.getLogger(VBoxConnector.class);
private final VirtualBoxManager vBoxManager;
private IVirtualBox vBox;
private VBoxApplianceImporter vBoxImporter;
private boolean isConnected;
public VBoxConnector() {
this.vBoxManager = VirtualBoxManager.createInstance(null);
}
private boolean isNotConnected() {
return !isConnected;
}
public VirtualBoxManager getVBoxManager() {
return this.vBoxManager;
}
public VBoxApplianceImporter getVBoxImporter() {
return this.vBoxImporter;
}
/**
* The LinkUpDelay specifies how many milliseconds the network adapter of
* the guest machine remains silent until he resumes his work stored in his
* networkstack.
*
* @param milliSeconds timeout to set in ms
*/
private void setLinkUpDelay(int milliSeconds) {
int existingDelay = -1;
try {
existingDelay = Integer.parseInt(vBox.getExtraData("VBoxInternal"
+ "/Devices/e1000/0/Config/LinkUpDelay"));
} catch (NumberFormatException exception) {
// ignore, usually was an empty value
}
if (existingDelay != milliSeconds) {
log.info("Disabling LinkUpDelay for this VirtualBox instance...");
vBox.setExtraData(
"VBoxInternal/Devices/e1000/0/Config/LinkUpDelay",
Integer.toString(milliSeconds));
}
}
/**
* Establish the connection to the VirtualBox web service of not already
* done.<br>
* Creates also other important objects as the {@link VirtualBoxManager} and
* a {@link VBoxApplianceImporter}.
*
* @return VirtualBox interface object
*/
public IVirtualBox connect() {
if (isNotConnected()) {
log.trace("Connecting in VBoxConnector");
String host = Configuration.get("virtual.vbox.websrv.host");
String port = Configuration.get("virtual.vbox.websrv.port");
String username = Configuration.get("virtual.vbox.websrv.user");
String password = Configuration.get("virtual.vbox.websrv.password");
try {
this.vBoxManager.connect(host + ":" + port, username, password);
isConnected = true;
vBox = vBoxManager.getVBox();
log.debug(String.format("Using VirtualBox version '%s'",
vBox.getVersion()));
vBoxImporter = new VBoxApplianceImporter(vBox);
// no delay, continue with network usage immediately
this.setLinkUpDelay(0);
} catch (org.virtualbox_4_2.VBoxException exception) {
if (exception.getMessage().contains(
"reasonText argument for "
+ "createFault was passed NULL")) {
log.error("Connecting to vboxWebSrv failed, please deactivate"
+ " the websrvauthlibrary manually: 'VBoxManage.exe "
+ "setproperty websrvauthlibrary null'");
throw exception;
} else if (exception.getMessage().equals(
"HTTP transport error: java.net.ConnectException: "
+ "Connection refused")) {
log.error("VBoxWebSrv does not seem to be running on the specified address!");
throw exception;
} else {
// unknown exception, can't solve situation
log.error("Unknown exception while connecting to vboxWebSrv");
throw exception;
}
}
}
return vBox;
}
}