/*
* ###
* Framework Web Archive
*
* Copyright (C) 1999 - 2012 Photon Infotech Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ###
*/
package com.photon.phresco.framework.actions.applications;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.quartz.CronExpression;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import com.photon.phresco.commons.AndroidConstants;
import com.photon.phresco.commons.CIBuild;
import com.photon.phresco.commons.CIJob;
import com.photon.phresco.commons.CIJobStatus;
import com.photon.phresco.commons.CIPasswordScrambler;
import com.photon.phresco.commons.FrameworkConstants;
import com.photon.phresco.commons.XCodeConstants;
import com.photon.phresco.configuration.Environment;
import com.photon.phresco.framework.PhrescoFrameworkFactory;
import com.photon.phresco.framework.actions.FrameworkBaseAction;
import com.photon.phresco.framework.api.ActionType;
import com.photon.phresco.framework.api.Project;
import com.photon.phresco.framework.api.ProjectAdministrator;
import com.photon.phresco.framework.api.ProjectRuntimeManager;
import com.photon.phresco.framework.commons.ApplicationsUtil;
import com.photon.phresco.framework.commons.DiagnoseUtil;
import com.photon.phresco.framework.commons.FrameworkUtil;
import com.photon.phresco.framework.commons.LogErrorReport;
import com.photon.phresco.framework.commons.PBXNativeTarget;
import com.photon.phresco.util.IosSdkUtil;
import com.photon.phresco.util.IosSdkUtil.MacSdkType;
import com.photon.phresco.util.TechnologyTypes;
import com.photon.phresco.util.Utility;
public class CI extends FrameworkBaseAction implements FrameworkConstants {
private static final long serialVersionUID = -2040671011555139339L;
private static final Logger S_LOGGER= Logger.getLogger(CI.class);
private static Boolean debugEnabled = S_LOGGER.isDebugEnabled();
private String name = null;
private String svnurl = null;
private String username = null;
private String password = null;
private String[] emails = null;
private String successEmailIds = null;
private String failureEmailIds = null;
private String schedule = null;
private String cronExpression = null;
private String projectCode = null;
private String showSettings = null;
private List<String> serverSettings = null;
private List<String> dbSettings = null;
private List<String> websrvcSettings = null;
private List<String> emailSettings = null;
private String database = null;
private String server = null;
private String email = null;
private String webservice = null;
private String buildDownloadUrl = null;
private InputStream fileInputStream;
private String fileName = "";
private String senderEmailId = null;
private String senderEmailPassword = null;
private int totalBuildSize;
boolean buildInProgress = false;
private String environment = null;
private String sdk = null;
private String mode = null;
private String androidVersion = null;
private String signing = null;
private String target = "";
private String proguard = null;
private List<String> triggers = null;
private String buildNumber = null;
CIJob job = null;
private String oldJobName = null;
private int numberOfJobsInProgress = 0;
private String downloadJobName = null;
private String svnType = null;
private String branch = null;
private String localJenkinsAlive = "";
//collabNet implementation
private boolean enableBuildRelease = false;
private String collabNetURL = "";
private String collabNetusername = "";
private String collabNetpassword = "";
private String collabNetProject = "";
private String collabNetPackage = "";
private String collabNetRelease = "";
private boolean collabNetoverWriteFiles = false;
public String ci() {
S_LOGGER.debug("Entering Method CI.ci()");
try {
boolean jenkinsAlive = false;
//UI didnt trigger anybuild from here
getHttpRequest().setAttribute(CI_BUILD_TRIGGERED_FROM_UI, FALSE);
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = (Project) administrator.getProject(projectCode);
getHttpRequest().setAttribute(REQ_PROJECT, project);
getHttpRequest().setAttribute(REQ_SELECTED_MENU, APPLICATIONS);
getHttpRequest().setAttribute(CI_JENKINS_ALIVE, jenkinsAlive);
jenkinsAlive = DiagnoseUtil.isConnectionAlive(HTTP_PROTOCOL, LOCALHOST, Integer.parseInt(getPortNo(Utility.getJenkinsHome())));
S_LOGGER.debug("jenkins Alive " + jenkinsAlive);
getHttpRequest().setAttribute(CI_JENKINS_ALIVE, jenkinsAlive);
List<CIJob> existingJobs = administrator.getJobs(project);
Map<String, List<CIBuild>> ciJobsAndBuilds = new HashMap<String, List<CIBuild>>();
if(existingJobs != null) {
for (CIJob ciJob : existingJobs) {
boolean buildJenkinsAlive = false;
boolean isJobCreatingBuild = false;
int noOfJobsIsInProgress = 0;
List<CIBuild> builds = null;
buildInProgress =false;
buildJenkinsAlive = DiagnoseUtil.isConnectionAlive(HTTP_PROTOCOL, ciJob.getJenkinsUrl(), Integer.parseInt(ciJob.getJenkinsPort()));
isJobCreatingBuild = administrator.isJobCreatingBuild(ciJob);
S_LOGGER.debug("ciJob.getName() ====> " + ciJob.getName());
S_LOGGER.debug("ciJob.getName() alive ====> " + buildJenkinsAlive);
S_LOGGER.debug("ciJob.getName() isJobCreatingBuild ====> " + isJobCreatingBuild);
getHttpRequest().setAttribute(CI_BUILD_JENKINS_ALIVE + ciJob.getName(), buildJenkinsAlive);
getHttpRequest().setAttribute(CI_BUILD_IS_IN_PROGRESS + ciJob.getName(), isJobCreatingBuild);
if(buildJenkinsAlive == true) {
builds = administrator.getBuilds(ciJob);
}
S_LOGGER.debug("ciJob.getName() builds ====> " + builds);
ciJobsAndBuilds.put(ciJob.getName(), builds);
}
}
getHttpRequest().setAttribute(REQ_EXISTING_JOBS, ciJobsAndBuilds);
numberOfJobsIsInProgress();
S_LOGGER.debug("numberOfJobsInProgress " + numberOfJobsInProgress);
getHttpRequest().setAttribute(CI_NO_OF_JOBS_IN_PROGRESS, numberOfJobsInProgress);
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.ci()" + FrameworkUtil.getStackTraceAsString(e));
}
return APP_CI;
}
public String configure() {
S_LOGGER.debug("Entering Method CI.configure()");
try {
String[] selectedJobsName = getHttpRequest().getParameterValues(REQ_SELECTED_JOBS_LIST);
String jobName = "";
if (!ArrayUtils.isEmpty(selectedJobsName)) {
jobName = selectedJobsName[0];
}
S_LOGGER.debug("selectedJobs for configuration " + jobName);
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
// Get environment info
List<Environment> environments = administrator.getEnvironments(project);
getHttpRequest().setAttribute(REQ_ENVIRONMENTS, environments);
getHttpRequest().setAttribute(REQ_PROJECT, project);
// Get xcode targets
String technology = project.getProjectInfo().getTechnology().getId();
if (TechnologyTypes.IPHONES.contains(technology)) {
List<PBXNativeTarget> xcodeConfigs = ApplicationsUtil.getXcodeConfiguration(projectCode);
getHttpRequest().setAttribute(REQ_XCODE_CONFIGS, xcodeConfigs);
// get list of sdks
List<String> iphoneSdks = IosSdkUtil.getMacSdks(MacSdkType.iphoneos);
iphoneSdks.addAll(IosSdkUtil.getMacSdks(MacSdkType.iphonesimulator));
iphoneSdks.addAll(IosSdkUtil.getMacSdks(MacSdkType.macosx));
getHttpRequest().setAttribute(REQ_IPHONE_SDKS, iphoneSdks);
}
CIJob existJob = administrator.getJob(project, jobName);
existJob.setCollabNetpassword(CIPasswordScrambler.unmask(existJob.getCollabNetpassword()));
getHttpRequest().setAttribute(REQ_EXISTING_JOB, existJob);
getHttpRequest().setAttribute(REQ_SELECTED_MENU, APPLICATIONS);
getHttpRequest().setAttribute(REQ_PROJECT_CODE , projectCode);
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.configure()" + FrameworkUtil.getStackTraceAsString(e));
new LogErrorReport(e, "CI configuration clicked");
}
return APP_CI_CONFIGURE;
}
public String setup() {
if (debugEnabled) {
S_LOGGER.debug("Entering Method CI.setup()");
}
try {
ProjectRuntimeManager runtimeManager = PhrescoFrameworkFactory.getProjectRuntimeManager();
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
ActionType actionType = ActionType.JENKINS_SETUP;
actionType.setWorkingDirectory(Utility.getJenkinsHome());
if (debugEnabled) {
S_LOGGER.debug("Jenkins Home " + Utility.getJenkinsHome().toString());
}
// Here we have to place two files in jenkins_home environment variable location
administrator.getJdkHomeXml();
administrator.getMavenHomeXml();
// place email ext plugin in plugin folder
administrator.getEmailExtPlugin();
BufferedReader reader = runtimeManager.performAction(project, actionType, null, null);
getHttpSession().setAttribute(projectCode + CI_SETUP, reader);
getHttpRequest().setAttribute(REQ_PROJECT_CODE, projectCode);
getHttpRequest().setAttribute(REQ_TEST_TYPE, CI_SETUP );
} catch (Exception e) {
if (debugEnabled) {
S_LOGGER.error("Entered into catch block of CI.setup()" + FrameworkUtil.getStackTraceAsString(e));
}
}
return APP_ENVIRONMENT_READER;
}
public String save() {
S_LOGGER.debug("Entering Method CI.save()");
return doUpdateSave(CI_CREATE_JOB_COMMAND);
}
public String update() {
S_LOGGER.debug("Entering Method CI.update()");
return doUpdateSave(CI_UPDATE_JOB_COMMAND);
}
public String doUpdateSave(String jobType) {
S_LOGGER.debug("Entering Method CI.doUpdateSave()");
try {
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
String technology = project.getProjectInfo().getTechnology().getId();
CIJob existJob = null;
if(StringUtils.isNotEmpty(oldJobName)) {
existJob = administrator.getJob(project, oldJobName);
}
if(existJob == null) {
existJob = new CIJob();
}
InetAddress thisIp =InetAddress.getLocalHost();
existJob.setName(name);
existJob.setSvnUrl(svnurl);
existJob.setUserName(username);
existJob.setPassword(CIPasswordScrambler.mask(password));
existJob.setJenkinsUrl(thisIp.getHostAddress());
existJob.setJenkinsPort(getPortNo(Utility.getJenkinsHome()));
existJob.setTriggers(triggers);
Map<String, String> emails = new HashMap<String, String>(2);
emails.put(REQ_KEY_SUCCESS_EMAILS, successEmailIds);
emails.put(REQ_KEY_FAILURE_EMAILS, failureEmailIds);
Map<String, String> settingsInfoMap = new HashMap<String, String>(2);
ActionType actionType = null;
//For web technologies
if(StringUtils.isNotEmpty(environment)) {
settingsInfoMap.put(ENVIRONMENT_NAME, environment);
}
// For android technologies
if (StringUtils.isNotEmpty(androidVersion)) {
settingsInfoMap.put(AndroidConstants.ANDROID_VERSION_MVN_PARAM, androidVersion);
}
// For iphone technoloies
if (TechnologyTypes.IPHONES.contains(technology)) {
settingsInfoMap.put(IPHONE_SDK, sdk);
settingsInfoMap.put(IPHONE_CONFIGURATION, mode);
settingsInfoMap.put(IPHONE_TARGET_NAME, target);
if (TechnologyTypes.IPHONE_HYBRID.equals(technology)) {
settingsInfoMap.put(IPHONE_PLISTFILE, XCodeConstants.HYBRID_PLIST);
settingsInfoMap.put(ENCRYPT, FALSE);
} else if (TechnologyTypes.IPHONE_NATIVE.equals(technology)) {
settingsInfoMap.put(IPHONE_PLISTFILE, XCodeConstants.NATIVE_PLIST);
settingsInfoMap.put(ENCRYPT, TRUE);
}
}
// For mobile technologies
if (TechnologyTypes.ANDROIDS.contains(technology)) {
if (StringUtils.isEmpty(proguard)) {
// if the checkbox is selected value should be set to false otherwise true
proguard = TRUE;
}
settingsInfoMap.put(ANDROID_PROGUARD_SKIP, proguard);
actionType = ActionType.MOBILE_COMMON_COMMAND;
if (StringUtils.isNotEmpty(signing)) {
actionType.setProfileId(PROFILE_ID);
}
} else if (TechnologyTypes.IPHONES.contains(technology)) {
actionType = ActionType.IPHONE_BUILD_UNIT_TEST;
} else {
actionType = ActionType.BUILD;
}
ProjectRuntimeManager runtimeManager = PhrescoFrameworkFactory.getProjectRuntimeManager();
String mvncmd = "";
StringBuilder command = actionType.getCommand();
StringBuilder buildMavenCommand = new StringBuilder();
if (command == null) {
buildMavenCommand = runtimeManager.buildMavenCommand(project, actionType, settingsInfoMap);
} else {
buildMavenCommand.append(command);
buildMavenCommand.append(SPACE);
buildMavenCommand.append(runtimeManager.buildMavenArgCommand(actionType, settingsInfoMap));
}
mvncmd = buildMavenCommand.toString().substring(4).trim();
mvncmd = CI_PROFILE + mvncmd;
S_LOGGER.debug("mvn command " + mvncmd);
existJob.setMvnCommand(mvncmd);
existJob.setEmail(emails);
existJob.setScheduleType(schedule);
existJob.setScheduleExpression(cronExpression);
existJob.setSenderEmailId(senderEmailId);
existJob.setSenderEmailPassword(senderEmailPassword);
existJob.setBranch(branch);
existJob.setRepoType(svnType);
// collabNet file release plugin imple
existJob.setEnableBuildRelease(enableBuildRelease);
existJob.setCollabNetURL(collabNetURL);
existJob.setCollabNetusername(collabNetusername);
existJob.setCollabNetpassword(CIPasswordScrambler.mask(collabNetpassword));
existJob.setCollabNetProject(collabNetProject);
existJob.setCollabNetPackage(collabNetPackage);
existJob.setCollabNetRelease(collabNetRelease);
existJob.setCollabNetoverWriteFiles(collabNetoverWriteFiles);
if(CI_CREATE_JOB_COMMAND.equals(jobType)) {
administrator.createJob(project, existJob);
addActionMessage(getText(SUCCESS_JOB));
} else if(CI_UPDATE_JOB_COMMAND.equals(jobType)) {
administrator.updateJob(project, existJob);
addActionMessage(getText(SUCCESS_UPDATE));
}
restartJenkins(); // TODO: reload config
getHttpRequest().setAttribute(REQ_SELECTED_MENU, APPLICATIONS);
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.doUpdateSave()" + FrameworkUtil.getStackTraceAsString(e));
addActionMessage(getText(CI_SAVE_UPDATE_FAILED, e.getLocalizedMessage()));
}
return ci();
}
public String build() {
S_LOGGER.debug("Entering Method CI.build()");
try {
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
String[] selectedJobs = getHttpRequest().getParameterValues(REQ_SELECTED_JOBS_LIST);
CIJobStatus ciJobStatus = administrator.buildJobs(project, Arrays.asList(selectedJobs));
if(ciJobStatus.getCode() == JOB_STATUS_NOTOK) {
S_LOGGER.debug("Jenkins build job status code " + ciJobStatus.getCode());
addActionError(getText(ciJobStatus.getMessage()));
} else {
S_LOGGER.debug("Jenkins build job status code " + ciJobStatus.getCode());
addActionMessage(getText(ciJobStatus.getMessage()));
}
getHttpRequest().setAttribute(REQ_SELECTED_MENU, APPLICATIONS);
getHttpRequest().setAttribute(CI_BUILD_TRIGGERED_FROM_UI, TRUE);
} catch (Exception e) {
getHttpRequest().setAttribute(CI_BUILD_TRIGGERED_FROM_UI, FALSE);
S_LOGGER.error("Entered into catch block of CI.build()" + FrameworkUtil.getStackTraceAsString(e));
addActionMessage(getText(CI_BUILD_FAILED, e.getLocalizedMessage()));
}
return ci();
}
public String getTotalBuilds() {
if (debugEnabled) {
S_LOGGER.debug("Entering Method CI.getTotalBuilds()");
}
try {
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
totalBuildSize = administrator.getTotalBuilds(project); // when getting all the builds , it ll try to get all build status, so it ll return -1.
} catch (Exception e) {
totalBuildSize = -1;
}
return "success";
}
public String deleteCIBuild(){
S_LOGGER.debug("Entering Method CI.deleteCIBuild()");
String[] selectedBuilds = getHttpRequest().getParameterValues(REQ_SELECTED_BUILDS_LIST);
S_LOGGER.debug("selectedBuilds " + selectedBuilds.toString());
// job name and builds
Map<String, List<String>> buildsTobeDeleted = new HashMap<String, List<String>>();
for (String build : selectedBuilds) {
S_LOGGER.debug("Build" + build);
String[] split = build.split(",");
S_LOGGER.debug("split " + split[0]);
List<String> buildNumbers = new ArrayList<String>();
if(buildsTobeDeleted.containsKey(split[0])) {
List<String> listBuildNos = buildsTobeDeleted.get(split[0]);
listBuildNos.add(split[1]);
buildsTobeDeleted.put(split[0], listBuildNos);
} else {
buildNumbers.add(split[1]);
buildsTobeDeleted.put(split[0], buildNumbers);
}
}
Iterator iterator = buildsTobeDeleted.keySet().iterator();
while (iterator.hasNext()) {
String jobName = iterator.next().toString();
List<String> versions = buildsTobeDeleted.get(jobName);
S_LOGGER.debug("jobName " + jobName + " builds " + versions);
}
try {
ProjectAdministrator administrator = getProjectAdministrator();
Project project = administrator.getProject(projectCode);
CIJobStatus ciJobStatus = administrator.deleteCIBuild(project, buildsTobeDeleted);
if(ciJobStatus.getCode() == JOB_STATUS_NOTOK) {
S_LOGGER.debug("Jenkins delete build status code " + ciJobStatus.getCode());
addActionError(getText(ciJobStatus.getMessage()));
} else {
S_LOGGER.debug("Jenkins delete build status code " + ciJobStatus.getCode());
addActionMessage(getText(ciJobStatus.getMessage()));
}
getHttpRequest().setAttribute("project", project);
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.deleteCIBuild()" + FrameworkUtil.getStackTraceAsString(e));
new LogErrorReport(e, "Build delete");
}
getHttpRequest().setAttribute(REQ_SELECTED_MENU, APPLICATIONS);
return ci();
}
public String deleteCIJob(){
S_LOGGER.debug("Entering Method CI.deleteCIJob()");
String[] selectedJobs = getHttpRequest().getParameterValues(REQ_SELECTED_JOBS_LIST);
S_LOGGER.debug("delete selectedJobs " + selectedJobs);
try {
ProjectAdministrator administrator = getProjectAdministrator();
Project project = administrator.getProject(projectCode);
CIJobStatus ciJobStatus = administrator.deleteCIJobs(project, Arrays.asList(selectedJobs));
if(ciJobStatus.getCode() == JOB_STATUS_NOTOK) {
S_LOGGER.debug("Jenkins delete job status code " + ciJobStatus.getCode());
addActionError(getText(ciJobStatus.getMessage()));
} else {
S_LOGGER.debug("Jenkins delete job status code " + ciJobStatus.getCode());
addActionMessage(getText(ciJobStatus.getMessage()));
}
getHttpRequest().setAttribute("project", project);
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.deleteCIJob()" + FrameworkUtil.getStackTraceAsString(e));
new LogErrorReport(e, "Job delete");
}
getHttpRequest().setAttribute(REQ_SELECTED_MENU, APPLICATIONS);
return ci();
}
public String startJenkins() {
S_LOGGER.debug("Entering Method CI.startJenkins()");
try {
ProjectRuntimeManager runtimeManager = PhrescoFrameworkFactory.getProjectRuntimeManager();
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
ActionType actionType = ActionType.JENKINS_START;
actionType.setWorkingDirectory(Utility.getJenkinsHome());
S_LOGGER.debug("Jenkins Home " + Utility.getJenkinsHome().toString());
BufferedReader reader = runtimeManager.performAction(project, actionType, null, null);
getHttpSession().setAttribute(projectCode + CI_START, reader);
getHttpRequest().setAttribute(REQ_PROJECT_CODE, projectCode);
getHttpRequest().setAttribute(REQ_TEST_TYPE, CI_START );
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.startJenkins()" + FrameworkUtil.getStackTraceAsString(e));
}
return APP_ENVIRONMENT_READER;
}
public String stopJenkins() {
S_LOGGER.debug("Entering Method CI.stopJenkins()");
try {
ProjectRuntimeManager runtimeManager = PhrescoFrameworkFactory.getProjectRuntimeManager();
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
ActionType actionType = ActionType.JENKINS_STOP;
actionType.setWorkingDirectory(Utility.getJenkinsHome());
S_LOGGER.debug("Jenkins Home " + Utility.getJenkinsHome().toString());
BufferedReader reader = runtimeManager.performAction(project, actionType, null, null);
getHttpSession().setAttribute(projectCode + CI_STOP, reader);
getHttpRequest().setAttribute(REQ_PROJECT_CODE, projectCode);
getHttpRequest().setAttribute(REQ_TEST_TYPE, CI_STOP );
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.stopJenkins()" + FrameworkUtil.getStackTraceAsString(e));
}
return APP_ENVIRONMENT_READER;
}
public String restartJenkins() {
S_LOGGER.debug("Entering Method CI.restartJenkins()");
try {
stopJenkins();
S_LOGGER.debug("stopJenkins method called");
BufferedReader reader = (BufferedReader) getHttpSession().getAttribute(projectCode + CI_STOP);
String line;
line = reader.readLine();
while (!line.startsWith("[INFO] BUILD SUCCESS")) {
line = reader.readLine();
if (debugEnabled) {
S_LOGGER.debug("Restart Stop Console : " + line);
}
}
waitForTime(5);
startJenkins();
if (debugEnabled) {
S_LOGGER.debug("startJenkins method called");
}
BufferedReader reader1 = (BufferedReader) getHttpSession().getAttribute(projectCode + CI_START);
String line1;
line1 = reader1.readLine();
while (!line1.startsWith("[INFO] BUILD SUCCESS")) {
line1 = reader1.readLine();
if (debugEnabled) {
S_LOGGER.debug("Restart Start Console : " + line);
}
}
waitForTime(2);
} catch (Exception e) {
if (debugEnabled) {
S_LOGGER.error("Entered into catch block of CI.restartJenkins()" + FrameworkUtil.getStackTraceAsString(e));
}
}
return "restarted";
}
public void waitForTime(int waitSec) {
S_LOGGER.debug("waitForTime : " + waitSec);
long startTime = 0;
startTime = new Date().getTime();
while (new Date().getTime() < startTime + waitSec * 1000) {
//Dont do anything for some seconds. It waits till the log is written to file
}
S_LOGGER.debug("Return from waitForTime ");
}
public String cronValidation() {
S_LOGGER.debug("Entering Method CI.cronValidation()");
try {
HttpServletRequest request = getHttpRequest();
String cronBy = request.getParameter(REQ_CRON_BY);
String jobName = "Job Name";
String cronExpression = "";
Date[] dates = null;
if (REQ_CRON_BY_DAILY.equals(cronBy)) {
String hours = request.getParameter(REQ_HOURS);
String minutes = request.getParameter(REQ_MINUTES);
String every = request.getParameter(REQ_SCHEDULE_EVERY);
if ("false".equals(every)) {
if ("*".equals(hours) && "*".equals(minutes)) {
cronExpression = "0 * * * * ?";
} else if ("*".equals(hours) && !"*".equals(minutes)) {
cronExpression = "0 " + minutes + " 0 * * ?";
} else if (!"*".equals(hours) && "*".equals(minutes)) {
cronExpression = "0 0 " + hours + " * * ?";
} else if (!"*".equals(hours) && !"*".equals(minutes)) {
cronExpression = "0 " + minutes + " " + hours + " * * ?";
}
} else {
if ("*".equals(hours) && "*".equals(minutes)) {
cronExpression = "0 * * * * ?";
} else if ("*".equals(hours) && !"*".equals(minutes)) {
cronExpression = "0 " + "*/" + minutes + " * * * ?"; // 0 replace with *
} else if (!"*".equals(hours) && "*".equals(minutes)) {
cronExpression = "0 0 " + "*/" + hours + " * * ?"; // 0 replace with *
} else if (!"*".equals(hours) && !"*".equals(minutes)) {
cronExpression = "0 " + minutes + " */" + hours + " * * ?"; // 0 replace with *
}
}
dates = testCronExpression(cronExpression);
} else if (REQ_CRON_BY_WEEKLY.equals(cronBy)) {
String hours = request.getParameter(REQ_HOURS);
String minutes = request.getParameter(REQ_MINUTES);
String week = request.getParameter(REQ_CRON_BY_WEEK);
hours = ("*".equals(hours)) ? "0" : hours;
minutes = ("*".equals(minutes)) ? "0" : minutes;
cronExpression = "0 " + minutes + " " + hours + " ? * " + week;
dates = testCronExpression(cronExpression);
} else if (REQ_CRON_BY_MONTHLY.equals(cronBy)) {
String hours = request.getParameter(REQ_HOURS);
String minutes = request.getParameter(REQ_MINUTES);
String month = request.getParameter(REQ_MONTH);
String day = request.getParameter(REQ_DAY);
hours = ("*".equals(hours)) ? "0" : hours;
minutes = ("*".equals(minutes)) ? "0" : minutes;
cronExpression = "0 " + minutes + " " + hours + " " + day + " " + month + " ?";
dates = testCronExpression(cronExpression);
}
if (dates != null) {
cronExpression = cronExpression.replace('?', '*');
cronExpression = cronExpression.substring(2);
request.setAttribute(REQ_CRON_EXPRESSION, cronExpression);
request.setAttribute(REQ_CRON_DATES, dates);
request.setAttribute(REQ_JOB_NAME, jobName);
return "cronValidation";
}
} catch (Exception e) {
if (debugEnabled) {
S_LOGGER.error("Entered into catch block of CI.cronValidation()" + FrameworkUtil.getStackTraceAsString(e));
}
// addActionError(getText("Cron Expression failed to validate"));
}
return "cronValidation";
}
public Date[] testCronExpression(String expression)throws ParseException{
Date[] dates = null;
try {
S_LOGGER.debug("Entering Method CI.testCronExpression(String expression)");
S_LOGGER.debug("testCronExpression() Expression = "+expression);
final CronExpression cronExpression = new CronExpression(expression);
final Date nextValidDate1 = cronExpression.getNextValidTimeAfter(new Date());
final Date nextValidDate2 = cronExpression.getNextValidTimeAfter(nextValidDate1);
final Date nextValidDate3 = cronExpression.getNextValidTimeAfter(nextValidDate2);
final Date nextValidDate4 = cronExpression.getNextValidTimeAfter(nextValidDate3);
dates = new Date[]{nextValidDate1,nextValidDate2,nextValidDate3,nextValidDate4};
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.testCronExpression()" + FrameworkUtil.getStackTraceAsString(e));
}
return dates;
}
public static String getPortNo(String path) throws Exception {
S_LOGGER.debug("Entering Method CI.getPortNo()");
String portNo = "";
try {
Document document = ApplicationsUtil.getDocument(new File(path + File.separator +"pom.xml"));
String portNoNode = "/project/build/plugins/plugin/configuration/tomcatHttpPort";
NodeList nodelist = org.apache.xpath.XPathAPI.selectNodeList(document, portNoNode);
portNo = nodelist.item(0).getTextContent();
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.getPortNo()" + FrameworkUtil.getStackTraceAsString(e));
}
return portNo;
}
public String CIBuildDownload() {
S_LOGGER.debug("Entering Method CI.CIBuildDownload()");
try {
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
CIJob existJob = administrator.getJob(project, downloadJobName);
//Get it from web path
URL url = new URL(buildDownloadUrl);
S_LOGGER.debug("Entering Method CI.CIBuildDownload() buildDownloadUrl " + buildDownloadUrl);
fileInputStream = url.openStream();
fileName = existJob.getName();
return SUCCESS;
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.CIBuildDownload()" + FrameworkUtil.getStackTraceAsString(e));
}
return SUCCESS;
}
public String buildProgress() {
S_LOGGER.debug("Entering Method CI.buildProgress()");
try {
buildInProgress = false;
String[] selectedJobs = getHttpRequest().getParameterValues(REQ_SELECTED_JOBS_LIST);
S_LOGGER.debug("build progress jobs monitoring");
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
CIJob existJob = administrator.getJob(project);
if(existJob != null) {
boolean buildJenkinsAlive = false;
buildJenkinsAlive = DiagnoseUtil.isConnectionAlive("http", existJob.getJenkinsUrl(), Integer.parseInt(existJob.getJenkinsPort()));
S_LOGGER.debug("Build jenkins alive " + buildJenkinsAlive);
if (buildJenkinsAlive == true && administrator.getProgressInBuild(project) > 0) {
buildInProgress = true;
}
}
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.buildProgress()" + FrameworkUtil.getStackTraceAsString(e));
}
return SUCCESS;
}
public String numberOfJobsIsInProgress() {
S_LOGGER.debug("Entering Method CI.numberOfJobsIsInProgress()");
try {
S_LOGGER.debug("numberOfJobsIsInProgress jobs monitoring");
ProjectAdministrator administrator = PhrescoFrameworkFactory.getProjectAdministrator();
Project project = administrator.getProject(projectCode);
List<CIJob> jobs = administrator.getJobs(project);
if(CollectionUtils.isNotEmpty(jobs)) {
for (CIJob ciJob : jobs) {
boolean jobCreatingBuild = administrator.isJobCreatingBuild(ciJob);
if(jobCreatingBuild) {
numberOfJobsInProgress++;
}
}
}
} catch (Exception e) {
S_LOGGER.error("Entered into catch block of CI.buildProgress()" + FrameworkUtil.getStackTraceAsString(e));
}
return SUCCESS;
}
public String localJenkinsLocalAlive() {
S_LOGGER.debug("Entering Method CI.localJenkinsLocalAlive()");
try {
URL url = new URL (HTTP_PROTOCOL + PROTOCOL_POSTFIX + LOCALHOST + COLON + Integer.parseInt(getPortNo(Utility.getJenkinsHome())) + FORWARD_SLASH + CI);
URLConnection connection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int code = httpConnection.getResponseCode();
localJenkinsAlive = code+"";
S_LOGGER.debug("localJenkinsAlive => " + localJenkinsAlive);
} catch (ConnectException e) {
localJenkinsAlive = "404";
S_LOGGER.debug("localJenkinsAlive => " + localJenkinsAlive);
} catch (Exception e) {
localJenkinsAlive = "404";
S_LOGGER.debug("localJenkinsAlive => " + localJenkinsAlive);
}
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSvnurl() {
return svnurl;
}
public void setSvnurl(String svnurl) {
this.svnurl = svnurl;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String[] getEmails() {
return emails;
}
public void setEmails(String[] email) {
this.emails = email;
}
public String getSuccessEmailIds() {
return successEmailIds;
}
public void setSuccessEmailIds(String successEmailId) {
this.successEmailIds = successEmailId;
}
public String getFailureEmailIds() {
return failureEmailIds;
}
public void setFailureEmailIds(String failureEmailId) {
this.failureEmailIds = failureEmailId;
}
public String getSchedule() {
return schedule;
}
public void setSchedule(String schedule) {
this.schedule = schedule;
}
public String getCronExpression() {
return cronExpression;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
public String getProjectCode() {
return projectCode;
}
public void setProjectCode(String projectCode) {
this.projectCode = projectCode;
}
public String getShowSettings() {
return showSettings;
}
public void setShowSettings(String showSettings) {
this.showSettings = showSettings;
}
public List<String> getServerSettings() {
return serverSettings;
}
public void setServerSettings(List<String> serverSettings) {
this.serverSettings = serverSettings;
}
public List<String> getDbSettings() {
return dbSettings;
}
public void setDbSettings(List<String> dbSettings) {
this.dbSettings = dbSettings;
}
public List<String> getWebsrvcSettings() {
return websrvcSettings;
}
public void setWebsrvcSettings(List<String> websrvcSettings) {
this.websrvcSettings = websrvcSettings;
}
public List<String> getEmailSettings() {
return emailSettings;
}
public void setEmailSettings(List<String> emailSettings) {
this.emailSettings = emailSettings;
}
public String getServer() {
return server;
}
public void setServer(String server) {
this.server = server;
}
public String getDatabase() {
return database;
}
public void setDatabase(String database) {
this.database = database;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getWebservice() {
return webservice;
}
public void setWebservice(String webservice) {
this.webservice = webservice;
}
public String getBuildDownloadUrl() {
return buildDownloadUrl;
}
public void setBuildDownloadUrl(String buildDownloadUrl) {
this.buildDownloadUrl = buildDownloadUrl;
}
public InputStream getFileInputStream() {
return fileInputStream;
}
public void setFileInputStream(InputStream fileInputStream) {
this.fileInputStream = fileInputStream;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getSenderEmailId() {
return senderEmailId;
}
public void setSenderEmailId(String senderEmailId) {
this.senderEmailId = senderEmailId;
}
public String getSenderEmailPassword() {
return senderEmailPassword;
}
public void setSenderEmailPassword(String senderEmailPassword) {
this.senderEmailPassword = senderEmailPassword;
}
public int getTotalBuildSize() {
return totalBuildSize;
}
public void setTotalBuildSize(int totalBuildSize) {
this.totalBuildSize = totalBuildSize;
}
public boolean isBuildInProgress() {
return buildInProgress;
}
public void setBuildInProgress(boolean buildInProgress) {
this.buildInProgress = buildInProgress;
}
public String getEnvironment() {
return environment;
}
public void setEnvironment(String environment) {
this.environment = environment;
}
public String getSdk() {
return sdk;
}
public void setSdk(String sdk) {
this.sdk = sdk;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
public String getAndroidVersion() {
return androidVersion;
}
public void setAndroidVersion(String androidVersion) {
this.androidVersion = androidVersion;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public String getProguard() {
return proguard;
}
public void setProguard(String proguard) {
this.proguard = proguard;
}
public List<String> getTriggers() {
return triggers;
}
public void setTriggers(List<String> triggers) {
this.triggers = triggers;
}
public String getBuildNumber() {
return buildNumber;
}
public void setBuildNumber(String buildNumber) {
this.buildNumber = buildNumber;
}
public String getOldJobName() {
return oldJobName;
}
public void setOldJobName(String oldJobName) {
this.oldJobName = oldJobName;
}
public int getNumberOfJobsInProgress() {
return numberOfJobsInProgress;
}
public void setNumberOfJobsInProgress(int numberOfJobsInProgress) {
this.numberOfJobsInProgress = numberOfJobsInProgress;
}
public String getDownloadJobName() {
return downloadJobName;
}
public void setDownloadJobName(String downloadJobName) {
this.downloadJobName = downloadJobName;
}
public String getSigning() {
return signing;
}
public void setSigning(String signing) {
this.signing = signing;
}
public String getSvnType() {
return svnType;
}
public void setSvnType(String svnType) {
this.svnType = svnType;
}
public String getBranch() {
return branch;
}
public void setBranch(String branch) {
this.branch = branch;
}
public String getLocalJenkinsAlive() {
return localJenkinsAlive;
}
public void setLocalJenkinsAlive(String localJenkinsAlive) {
this.localJenkinsAlive = localJenkinsAlive;
}
public boolean isEnableBuildRelease() {
return enableBuildRelease;
}
public void setEnableBuildRelease(boolean enableBuildRelease) {
this.enableBuildRelease = enableBuildRelease;
}
public String getCollabNetURL() {
return collabNetURL;
}
public void setCollabNetURL(String collabNetURL) {
this.collabNetURL = collabNetURL;
}
public String getCollabNetusername() {
return collabNetusername;
}
public void setCollabNetusername(String collabNetusername) {
this.collabNetusername = collabNetusername;
}
public String getCollabNetpassword() {
return collabNetpassword;
}
public void setCollabNetpassword(String collabNetpassword) {
this.collabNetpassword = collabNetpassword;
}
public String getCollabNetProject() {
return collabNetProject;
}
public void setCollabNetProject(String collabNetProject) {
this.collabNetProject = collabNetProject;
}
public String getCollabNetPackage() {
return collabNetPackage;
}
public void setCollabNetPackage(String collabNetPackage) {
this.collabNetPackage = collabNetPackage;
}
public String getCollabNetRelease() {
return collabNetRelease;
}
public void setCollabNetRelease(String collabNetRelease) {
this.collabNetRelease = collabNetRelease;
}
public boolean isCollabNetoverWriteFiles() {
return collabNetoverWriteFiles;
}
public void setCollabNetoverWriteFiles(boolean collabNetoverWriteFiles) {
this.collabNetoverWriteFiles = collabNetoverWriteFiles;
}
}