package org.jenkins.tools.test; import com.google.common.io.Files; import org.apache.commons.lang.StringUtils; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.jenkins.tools.test.model.PluginCompatReport; import org.jenkins.tools.test.model.PluginCompatResult; import org.jenkins.tools.test.model.PluginInfos; import org.jenkins.tools.test.model.utils.IOUtils; import java.io.*; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author fcamblor */ public class DataImporter { public static void main(String[] args) throws IOException { File reportFile = new File(args[0]); Long startingOffset = args.length>3?Long.valueOf(args[3]):Long.valueOf(0); String startingBuildLog = args.length>4?args[4]:null; new DataImporter(args[1], args[2], startingBuildLog).importExistingReport(reportFile, startingOffset); } private static final Pattern ID_EXTRACTOR = Pattern.compile("id=(.+)"); private String baseGAEUrl; private String securityToken; private String startingBuildLog; public DataImporter(String baseGAEUrl, String securityToken, String startingBuildLog){ this.baseGAEUrl = baseGAEUrl; this.securityToken = securityToken; this.startingBuildLog = startingBuildLog; } public DataImporter(String baseGAEUrl, String securityToken){ this(baseGAEUrl, securityToken, null); } public String importPluginCompatResult(PluginCompatResult pluginCompatResult, PluginInfos pluginInfos, File logsBaseDir) throws IOException { HttpClient httpClient = new DefaultHttpClient(); String url = baseGAEUrl+"/writePctResult"; HttpPost method = new HttpPost(url); List <NameValuePair> nvps = new ArrayList <NameValuePair>(); nvps.add(new BasicNameValuePair("token", securityToken)); nvps.add(new BasicNameValuePair("pluginName", pluginInfos.pluginName)); nvps.add(new BasicNameValuePair("pluginVersion", pluginInfos.pluginVersion)); nvps.add(new BasicNameValuePair("pluginUrl", pluginInfos.pluginUrl)); nvps.add(new BasicNameValuePair("mavenGAV", pluginCompatResult.coreCoordinates.toGAV())); nvps.add(new BasicNameValuePair("status", pluginCompatResult.status.name())); if(pluginCompatResult.compatTestExecutedOn != null){ nvps.add(new BasicNameValuePair("timestamp", String.valueOf(pluginCompatResult.compatTestExecutedOn.getTime()))); } if(pluginCompatResult.errorMessage != null){ nvps.add(new BasicNameValuePair("errMsg", pluginCompatResult.errorMessage)); } if(pluginCompatResult.warningMessages != null){ for(String warnMsg : pluginCompatResult.warningMessages){ nvps.add(new BasicNameValuePair("warnMsgs", warnMsg)); } } if(pluginCompatResult.getBuildLogPath() != null && !"".equals(pluginCompatResult.getBuildLogPath())){ String logContent = Files.toString(new File(logsBaseDir.getAbsolutePath()+File.separator+pluginCompatResult.getBuildLogPath()), Charset.forName("UTF-8")); logContent = logContent.trim(); // Only uploading non empty files if(!"".equals(logContent)){ nvps.add(new BasicNameValuePair("buildLogPath", pluginCompatResult.getBuildLogPath())); String compressedLogContent = IOUtils.gzipString(logContent); nvps.add(new BasicNameValuePair("logContent", compressedLogContent)); } } method.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); HttpResponse res = httpClient.execute(method); String responseBody = IOUtils.streamToString(res.getEntity().getContent()); if(res.getStatusLine().getStatusCode() != 200){ throw new IllegalStateException("Error while importing data : "+responseBody+" ("+res.getStatusLine().getStatusCode()+")"); } Matcher responseMatcher = ID_EXTRACTOR.matcher(responseBody); String key = null; if(responseMatcher.matches()){ key = responseMatcher.group(1); } return key; } public void importExistingReport(File reportFile, Long startingOffset) throws IOException { PluginCompatReport report = PluginCompatReport.fromXml(reportFile); int plannedRequestsCount = 0; for (Map.Entry<PluginInfos, List<PluginCompatResult>> test : report.getPluginCompatTests().entrySet()){ plannedRequestsCount += test.getValue().size(); } long i = 0; boolean startingBuildLogConstraintVerified = startingBuildLog==null; for (Map.Entry<PluginInfos, List<PluginCompatResult>> test : report.getPluginCompatTests().entrySet()){ for (PluginCompatResult pluginCompatResult : test.getValue()) { if(i >= startingOffset.longValue()){ if(startingBuildLog != null && startingBuildLog.equals(pluginCompatResult.getBuildLogPath())){ startingBuildLogConstraintVerified = true; } if(startingBuildLogConstraintVerified){ importPluginCompatResult(pluginCompatResult, test.getKey(), reportFile.getParentFile()); System.out.println(String.format("Executed request %d / %d", i, plannedRequestsCount)); } } i++; } } } }