package ru.qatools.gridrouter.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.SerializationUtils;
import ru.qatools.gridrouter.config.Browsers;
import javax.xml.bind.JAXB;
import java.io.File;
import java.io.StringWriter;
import static java.lang.ClassLoader.getSystemResource;
import static ru.qatools.gridrouter.utils.GridRouterRule.USER_1;
/**
* @author Innokenty Shuvalov innokenty@yandex-team.ru
*/
public final class QuotaUtils {
public static final String QUOTA_FILE_PATTERN
= getSystemResource("quota/" + USER_1 + ".xml").getPath().replace(USER_1, "%s");
private QuotaUtils() {
}
public static void replacePortInQuotaFile(String user, int port) {
replacePortInQuotaFile(user, 0, 0, port);
}
public static void replacePortInQuotaFile(String user, int regionNum, int hostNum, int port) {
copyQuotaFile(user, user, regionNum, hostNum, port);
}
public static void copyQuotaFile(String srcUser, String dstUser, int regionNum, int hostNum, int withHubPort) {
Browsers browsers = getQuotaFor(srcUser);
setPort(browsers, regionNum, hostNum, withHubPort);
writeQuotaFor(dstUser, browsers);
}
public static Browsers getQuotaFor(String user) {
File quotaFile = getQuotaFile(user);
Browsers browsersOriginal = JAXB.unmarshal(quotaFile, Browsers.class);
return SerializationUtils.clone(browsersOriginal);
}
public static synchronized void writeQuotaFor(String user, Browsers browsers) {
try {
//workaround to write the whole file at once
StringWriter xml = new StringWriter();
JAXB.marshal(browsers, xml);
final File fileToWrite = getQuotaFile(user);
final File tmpFile = File.createTempFile(user, "xml");
FileUtils.write(tmpFile, xml.toString());
FileUtils.copyFile(tmpFile, fileToWrite);
FileUtils.deleteQuietly(tmpFile);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static File getQuotaFile(String user) {
return new File(String.format(QUOTA_FILE_PATTERN, user));
}
@SuppressWarnings("ResultOfMethodCallIgnored")
public static void deleteQuotaFile(String user) {
getQuotaFile(user).delete();
}
public static void setPort(Browsers browsers, int regionNum, int hostNumber, int port) {
browsers.getBrowsers().get(0)
.getVersions().get(0)
.getRegions().get(regionNum)
.getHosts().get(hostNumber)
.setPort(port);
}
}