package org.hwbot.prime.service;
import java.util.Locale;
import java.util.Map;
import org.hwbot.api.bench.dto.DeviceInfoDTO;
import org.hwbot.api.bench.dto.PersistentLoginDTO;
import org.hwbot.bench.model.Request;
import org.hwbot.bench.prime.Log;
import org.hwbot.bench.security.EncryptionModule;
import android.os.Build;
/**
* Very dumb xml implementation in order to avoid any dependencies. JDK libraries are even avoided so it can be ported easier to iOS with RoboVM.
*
* @author frederik
*
*/
public class DataServiceXml {
private static final String xml10pattern = "[^" + "\u0009\r\n" + "\u0020-\uD7FF" + "\uE000-\uFFFD" + "\ud800\udc00-\udbff\udfff" + "]";
private static DataServiceXml service;
private DataServiceXml() {
}
public static DataServiceXml getInstance() {
if (service == null) {
service = new DataServiceXml();
}
return service;
}
public static String createXml(String version, Number score, Integer stageId, DeviceInfoDTO deviceInfo, PersistentLoginDTO credentials, EncryptionModule encryptionModule) {
AndroidHardwareService hardwareService = AndroidHardwareService.getInstance();
StringBuffer xml = new StringBuffer();
xml.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
xml.append("<submission xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://hwbot.org/submit/api\">");
xml.append("<application>");
xml.append("<name>HWBOT Prime</name>");
xml.append("<version>" + version + "</version>");
xml.append("</application>");
if (credentials != null) {
xml.append("<credentials>");
xml.append("<token>" + credentials.getToken() + "</token>");
xml.append("</credentials>");
}
xml.append("<score><points>" + score + "</points></score>");
if(stageId != null){
xml.append("<competitionStageId>" + stageId + "</competitionStageId>");
}
if (encryptionModule != null) {
Request request = new Request("HWBOT Prime", version, String.format(Locale.ENGLISH, "%.2f", score.floatValue()), null);
encryptionModule.addChecksum(request);
String checksum = request.getApplicationChecksum();
xml.append("<applicationChecksum>" + checksum + "</applicationChecksum>");
}
xml.append("<hardware>");
xml.append("<device>");
if (deviceInfo != null) {
if (deviceInfo.getId() != null) {
xml.append("<id>" + deviceInfo.getId() + "</id>");
}
if (deviceInfo.getName() != null) {
xml.append("<name><![CDATA[" + deviceInfo.getName() + "]]></name>");
}
}
xml.append("</device>");
if (deviceInfo.getProcessor() != null) {
xml.append("<processor>");
if (deviceInfo.getProcessorId() != null) {
xml.append("<id>" + deviceInfo.getProcessorId() + "</id>");
}
xml.append("<name><![CDATA[" + deviceInfo.getProcessor() + "]]></name>");
if (hardwareService.getMaxRecordedProcessorSpeed() > 0) {
xml.append("<coreClock>" + (hardwareService.getMaxRecordedProcessorSpeed()) + "</coreClock>");
}
if (hardwareService.getIdleTemperature() > 0 && hardwareService.getIdleTemperature() < Integer.MAX_VALUE) {
xml.append("<idleTemp>" + (hardwareService.getIdleTemperature()) + "</idleTemp>");
}
if (hardwareService.getLoadTemperature() > 0 && hardwareService.getLoadTemperature() < Integer.MAX_VALUE) {
xml.append("<loadTemp>" + (hardwareService.getLoadTemperature()) + "</loadTemp>");
}
xml.append("</processor>");
}
if (deviceInfo.getVideocard() != null) {
xml.append("<videocard>");
if (deviceInfo.getVideocard() != null) {
xml.append("<id>" + deviceInfo.getVideocardId() + "</id>");
}
xml.append("<name><![CDATA[" + deviceInfo.getVideocard() + "]]></name>");
xml.append("</videocard>");
}
xml.append("</hardware>");
xml.append("<software>");
xml.append("<os>");
xml.append("<family>Android</family>");
xml.append("<fullName>Android " + Build.VERSION.RELEASE + "</fullName>");
xml.append("</os>");
xml.append("</software>");
xml.append("<metadata name=\"java_environment\"><![CDATA[");
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
xml.append(String.format("%s=%s%n\n", envName, env.get(envName)).replaceAll(xml10pattern, ""));
}
xml.append("]]></metadata>");
xml.append("<metadata name=\"kernel\"><![CDATA[");
xml.append(hardwareService.getKernel());
xml.append("]]></metadata>");
xml.append("<metadata name=\"os_build\">");
xml.append(hardwareService.getOsBuild());
xml.append("</metadata>");
String osDebugInfo = hardwareService.getOsDebugInfo();
if (osDebugInfo != null) {
xml.append("<metadata name=\"os_dump\"><![CDATA[");
xml.append(osDebugInfo.replaceAll(xml10pattern, ""));
xml.append("]]></metadata>");
}
xml.append("</submission>");
// Log.info(DataServiceXml.class.getSimpleName(), xml.toString());
return xml.toString();
}
}