PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/test/jenkins-results-parser/src/main/java/com/liferay/jenkins/results/parser/BaseBuildData.java

http://github.com/liferay/liferay-portal
Java | 549 lines | 401 code | 132 blank | 16 comment | 48 complexity | 9a48b27942273bd62d0ef8158bebe283 MD5 | raw file
Possible License(s): LGPL-2.0
  1. /**
  2. * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
  3. *
  4. * This library is free software; you can redistribute it and/or modify it under
  5. * the terms of the GNU Lesser General Public License as published by the Free
  6. * Software Foundation; either version 2.1 of the License, or (at your option)
  7. * any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  11. * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  12. * details.
  13. */
  14. package com.liferay.jenkins.results.parser;
  15. import java.io.File;
  16. import java.io.IOException;
  17. import java.net.MalformedURLException;
  18. import java.net.URL;
  19. import java.util.ArrayList;
  20. import java.util.Date;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.regex.Matcher;
  25. import java.util.regex.Pattern;
  26. import org.json.JSONArray;
  27. import org.json.JSONObject;
  28. /**
  29. * @author Michael Hashimoto
  30. */
  31. public abstract class BaseBuildData implements BuildData {
  32. public static String getJobName(String buildURL) {
  33. if (buildURL == null) {
  34. return null;
  35. }
  36. Matcher matcher = _buildURLPattern.matcher(buildURL);
  37. if (!matcher.find()) {
  38. return null;
  39. }
  40. return matcher.group("jobName");
  41. }
  42. @Override
  43. public File getArtifactDir() {
  44. return new File(getWorkspaceDir(), getRunID());
  45. }
  46. @Override
  47. public String getBuildDescription() {
  48. return getString("build_description");
  49. }
  50. @Override
  51. public Long getBuildDuration() {
  52. return optLong("build_duration", Long.valueOf(0));
  53. }
  54. @Override
  55. public String getBuildDurationString() {
  56. return JenkinsResultsParserUtil.toDurationString(getBuildDuration());
  57. }
  58. @Override
  59. public Integer getBuildNumber() {
  60. return optInt("build_number");
  61. }
  62. @Override
  63. public String getBuildParameter(String key) {
  64. Map<String, String> buildParameters = getBuildParameters();
  65. return buildParameters.get(key);
  66. }
  67. @Override
  68. public Map<String, String> getBuildParameters() {
  69. if (_buildParameters != null) {
  70. return _buildParameters;
  71. }
  72. JSONObject buildURLJSONObject = _getBuildURLJSONObject();
  73. if (buildURLJSONObject == null) {
  74. throw new RuntimeException("Please set the build URL");
  75. }
  76. if (!buildURLJSONObject.has("actions")) {
  77. return null;
  78. }
  79. JSONArray actionsJSONArray = buildURLJSONObject.getJSONArray("actions");
  80. for (int i = 0; i < actionsJSONArray.length(); i++) {
  81. JSONObject actionsJSONObject = actionsJSONArray.getJSONObject(i);
  82. if ((actionsJSONObject == null) ||
  83. !actionsJSONObject.has("parameters")) {
  84. continue;
  85. }
  86. JSONArray parametersJSONArray = actionsJSONObject.getJSONArray(
  87. "parameters");
  88. _buildParameters = new HashMap<>();
  89. for (int j = 0; j < parametersJSONArray.length(); j++) {
  90. JSONObject parameterJSONObject =
  91. parametersJSONArray.getJSONObject(j);
  92. if ((parameterJSONObject == null) ||
  93. !parameterJSONObject.has("name") ||
  94. !parameterJSONObject.has("value")) {
  95. continue;
  96. }
  97. _buildParameters.put(
  98. parameterJSONObject.getString("name"),
  99. parameterJSONObject.getString("value"));
  100. }
  101. return _buildParameters;
  102. }
  103. return null;
  104. }
  105. @Override
  106. public String getBuildResult() {
  107. return optString("build_result", "");
  108. }
  109. @Override
  110. public String getBuildStatus() {
  111. return optString("build_status", "");
  112. }
  113. @Override
  114. public String getBuildURL() {
  115. return optString("build_url");
  116. }
  117. @Override
  118. public String getCohortName() {
  119. return optString("cohort_name");
  120. }
  121. @Override
  122. public Host getHost() {
  123. if (_host != null) {
  124. return _host;
  125. }
  126. String hostname = getHostname();
  127. if (hostname == null) {
  128. return null;
  129. }
  130. _host = HostFactory.newHost(hostname);
  131. return _host;
  132. }
  133. @Override
  134. public String getHostname() {
  135. return optString("hostname");
  136. }
  137. @Override
  138. public String getJenkinsGitHubBranchName() {
  139. return getGitHubBranchName(getJenkinsGitHubURL());
  140. }
  141. @Override
  142. public String getJenkinsGitHubRepositoryName() {
  143. return getGitHubRepositoryName(getJenkinsGitHubURL());
  144. }
  145. @Override
  146. public String getJenkinsGitHubURL() {
  147. return getString("jenkins_github_url");
  148. }
  149. @Override
  150. public String getJenkinsGitHubUsername() {
  151. return getGitHubUsername(getJenkinsGitHubURL());
  152. }
  153. @Override
  154. public String getJobName() {
  155. return optString("job_name");
  156. }
  157. @Override
  158. public String getJobURL() {
  159. return optString("job_url");
  160. }
  161. @Override
  162. public JSONObject getJSONObject() {
  163. return _jsonObject;
  164. }
  165. @Override
  166. public String getMasterHostname() {
  167. return optString("master_hostname");
  168. }
  169. @Override
  170. public String getRunID() {
  171. return getString("run_id");
  172. }
  173. @Override
  174. public Long getStartTime() {
  175. return getLong("start_time");
  176. }
  177. @Override
  178. public String getStartTimeString() {
  179. return getFormattedDate(getStartTime());
  180. }
  181. @Override
  182. public String getUserContentRelativePath() {
  183. return JenkinsResultsParserUtil.combine(
  184. "jobs/", getTopLevelJobName(), "/builds/",
  185. String.valueOf(getTopLevelBuildNumber()), "/");
  186. }
  187. @Override
  188. public File getWorkspaceDir() {
  189. return getFile("workspace_dir");
  190. }
  191. @Override
  192. public void setBuildDescription(String buildDescription) {
  193. put("build_description", buildDescription);
  194. }
  195. @Override
  196. public void setBuildDuration(Long buildDuration) {
  197. put("build_duration", buildDuration);
  198. }
  199. @Override
  200. public void setBuildResult(String buildResult) {
  201. put("build_result", buildResult);
  202. }
  203. @Override
  204. public void setBuildStatus(String buildStatus) {
  205. put("build_status", buildStatus);
  206. }
  207. @Override
  208. public void setBuildURL(String buildURL) {
  209. String currentBuildURL = getBuildURL();
  210. if ((currentBuildURL != null) && !currentBuildURL.isEmpty() &&
  211. !currentBuildURL.equals(buildURL)) {
  212. throw new IllegalStateException("Build URL may not be changed");
  213. }
  214. Matcher matcher = _buildURLPattern.matcher(buildURL);
  215. if (!matcher.find()) {
  216. throw new RuntimeException("Invalid build URL " + buildURL);
  217. }
  218. put("build_number", Integer.valueOf(matcher.group("buildNumber")));
  219. put("build_url", buildURL);
  220. put("cohort_name", matcher.group("cohortName"));
  221. put("hostname", _getHostname());
  222. put("job_url", matcher.group("jobURL"));
  223. put("master_hostname", matcher.group("masterHostname"));
  224. put("start_time", _getStartTime());
  225. put("type", getType());
  226. }
  227. @Override
  228. public void setInvocationTime(Long invocationTime) {
  229. put("invocation_time", invocationTime);
  230. }
  231. @Override
  232. public void setJenkinsGitHubURL(String jenkinsGitHubURL) {
  233. put("jenkins_github_url", jenkinsGitHubURL);
  234. }
  235. @Override
  236. public void setWorkspaceDir(File workspaceDir) {
  237. put(
  238. "workspace_dir",
  239. JenkinsResultsParserUtil.getCanonicalPath(workspaceDir));
  240. }
  241. protected static boolean isValidJSONObject(
  242. JSONObject jsonObject, String type) {
  243. if (jsonObject == null) {
  244. return false;
  245. }
  246. if (type == null) {
  247. return false;
  248. }
  249. if (jsonObject.has("type") &&
  250. type.equals(jsonObject.getString("type"))) {
  251. return true;
  252. }
  253. return false;
  254. }
  255. protected BaseBuildData(String runID, String jobName, String buildURL) {
  256. JSONObject jsonObject = buildDatabase.getBuildDataJSONObject(runID);
  257. String json = jsonObject.toString();
  258. if (json.equals("{}") && (buildURL != null)) {
  259. try {
  260. jsonObject = buildDatabase.getBuildDataJSONObject(
  261. new URL(buildURL));
  262. if (jsonObject.has("run_id")) {
  263. runID = jsonObject.getString("run_id");
  264. }
  265. }
  266. catch (MalformedURLException malformedURLException) {
  267. throw new RuntimeException(malformedURLException);
  268. }
  269. }
  270. _jsonObject = jsonObject;
  271. put("run_id", runID);
  272. if (jobName == null) {
  273. throw new RuntimeException("Please set a job name");
  274. }
  275. put("job_name", jobName);
  276. if (buildURL == null) {
  277. return;
  278. }
  279. setBuildURL(buildURL);
  280. if (!has("build_description")) {
  281. setBuildDescription(_getDefaultBuildDescription());
  282. }
  283. setJenkinsGitHubURL(URL_JENKINS_GITHUB_DEFAULT);
  284. setWorkspaceDir(DIR_WORKSPACE_DEFAULT);
  285. validateKeys(_KEYS_REQUIRED);
  286. }
  287. protected File getFile(String key) {
  288. return new File(getString(key));
  289. }
  290. protected String getFormattedDate(Long timestamp) {
  291. return JenkinsResultsParserUtil.toDateString(
  292. new Date(timestamp), "MMM dd, yyyy h:mm:ss a z", "US/Pacific");
  293. }
  294. protected String getGitHubBranchName(String gitHubBranchURL) {
  295. Matcher matcher = _gitHubBranchURLPattern.matcher(gitHubBranchURL);
  296. if (!matcher.find()) {
  297. throw new RuntimeException(
  298. "Invalid GitHub Branch URL " + gitHubBranchURL);
  299. }
  300. return matcher.group("branchName");
  301. }
  302. protected String getGitHubRepositoryName(String gitHubBranchURL) {
  303. Matcher matcher = _gitHubBranchURLPattern.matcher(gitHubBranchURL);
  304. if (!matcher.find()) {
  305. throw new RuntimeException(
  306. "Invalid GitHub Branch URL " + gitHubBranchURL);
  307. }
  308. return matcher.group("repositoryName");
  309. }
  310. protected String getGitHubUsername(String gitHubBranchURL) {
  311. Matcher matcher = _gitHubBranchURLPattern.matcher(gitHubBranchURL);
  312. if (!matcher.find()) {
  313. throw new RuntimeException(
  314. "Invalid GitHub Branch URL " + gitHubBranchURL);
  315. }
  316. return matcher.group("username");
  317. }
  318. protected JSONArray getJSONArray(String key) {
  319. return _jsonObject.getJSONArray(key);
  320. }
  321. protected JSONObject getJSONObject(String key) {
  322. return _jsonObject.getJSONObject(key);
  323. }
  324. protected List<String> getList(String key) {
  325. JSONArray jsonArray = getJSONArray(key);
  326. List<String> list = new ArrayList<>(jsonArray.length());
  327. for (int i = 0; i < jsonArray.length(); i++) {
  328. list.add(jsonArray.getString(i));
  329. }
  330. return list;
  331. }
  332. protected Long getLong(String key) {
  333. return _jsonObject.getLong(key);
  334. }
  335. protected String getString(String key) {
  336. return _jsonObject.getString(key);
  337. }
  338. protected abstract String getType();
  339. protected boolean has(String key) {
  340. return _jsonObject.has(key);
  341. }
  342. protected Integer optInt(String key) {
  343. return _jsonObject.optInt(key);
  344. }
  345. protected Long optLong(String key, Long defaultValue) {
  346. return _jsonObject.optLong(key, defaultValue);
  347. }
  348. protected String optString(String key) {
  349. return _jsonObject.optString(key);
  350. }
  351. protected String optString(String key, String defaultValue) {
  352. return _jsonObject.optString(key, defaultValue);
  353. }
  354. protected void put(String key, Object value) {
  355. _jsonObject.put(key, value);
  356. BuildDatabase buildDatabase = BuildDatabaseUtil.getBuildDatabase();
  357. buildDatabase.putBuildData(getRunID(), this);
  358. }
  359. protected void validateKeys(String[] requiredKeys) {
  360. for (String requiredKey : requiredKeys) {
  361. if (!has(requiredKey)) {
  362. throw new RuntimeException("Missing " + requiredKey);
  363. }
  364. }
  365. }
  366. protected static final BuildDatabase buildDatabase =
  367. BuildDatabaseUtil.getBuildDatabase();
  368. private JSONObject _getBuildURLJSONObject() {
  369. String buildURL = getBuildURL();
  370. if (buildURL == null) {
  371. return null;
  372. }
  373. try {
  374. return JenkinsResultsParserUtil.toJSONObject(
  375. JenkinsResultsParserUtil.getLocalURL(buildURL + "/api/json"));
  376. }
  377. catch (IOException ioException) {
  378. throw new RuntimeException(ioException);
  379. }
  380. }
  381. private String _getDefaultBuildDescription() {
  382. return JenkinsResultsParserUtil.combine(
  383. "<a href=\"https://", getTopLevelMasterHostname(),
  384. ".liferay.com/userContent/", getUserContentRelativePath(),
  385. "jenkins-report.html\">Jenkins Report</a>");
  386. }
  387. private String _getHostname() {
  388. JSONObject buildURLJSONObject = _getBuildURLJSONObject();
  389. if (buildURLJSONObject == null) {
  390. throw new RuntimeException("Please set the build URL");
  391. }
  392. return buildURLJSONObject.getString("builtOn");
  393. }
  394. private long _getStartTime() {
  395. JSONObject buildURLJSONObject = _getBuildURLJSONObject();
  396. if (buildURLJSONObject == null) {
  397. throw new RuntimeException("Please set the build URL");
  398. }
  399. return buildURLJSONObject.getLong("timestamp");
  400. }
  401. private static final String[] _KEYS_REQUIRED = {
  402. "build_description", "build_number", "build_url", "cohort_name",
  403. "hostname", "jenkins_github_url", "job_name", "master_hostname",
  404. "run_id", "workspace_dir"
  405. };
  406. private static final Pattern _buildURLPattern = Pattern.compile(
  407. JenkinsResultsParserUtil.combine(
  408. "(?<jobURL>https?://(?<masterHostname>",
  409. "(?<cohortName>test-\\d+)-\\d+)(\\.liferay\\.com)?/job/",
  410. "(?<jobName>[^/]+)/(.*/)?)(?<buildNumber>\\d+)/?"));
  411. private static final Pattern _gitHubBranchURLPattern = Pattern.compile(
  412. "https://github.com/(?<username>[^/]+)/(?<repositoryName>[^/]+)/tree/" +
  413. "(?<branchName>.+)");
  414. private Map<String, String> _buildParameters;
  415. private Host _host;
  416. private final JSONObject _jsonObject;
  417. }