Sunday, 9 September 2018

with Graph and Abort

VFP:


<apex:page standardController="Automated_Test_Run__c" extensions="AutomatedTestSetup_Controller" Sidebar="False" id="pg" docType="html-5.0">
<script>
function fnChange(DT)
{
// first make sure 'DT ' is not null here
alert('Hello datetime'+DT);
DTPass(DT);
//alert(DT);
}
</script>
    <apex:form id="frm">
        <apex:pageBlock title="Job Schedule - Test Execution">
        <apex:pageMessages />
                <apex:pageBlockSection title="Job Schedule" columns="1">
                    <apex:outputPanel rendered="{!hasScheduledJobs}">
                            <!-- Automated Test execution <a href="/08e">scheduled</a> {!DtValue}-->
                            Automated Test execution scheduled {!showdatetime} 

                            <!--Sheduled Jobs Showing Block-Start
                            <div>
                            <apex:pageBlockTable value="{!Schdjobs}" var="jobs">
                               <apex:column >
                                <apex:facet name="header">Scheduled Name</apex:facet>
                                <apex:outputText value="{!jobs.CronJobDetail.Name}"/>
                               </apex:column>                          
                               <apex:column >
                                <apex:facet name="header">Current State</apex:facet>
                                <apex:outputText value="{!jobs.State}"/>
                               </apex:column>
                                <apex:column >
                               <apex:facet name="header">Next Fire Time</apex:facet>
                                <apex:outputText value="{!jobs.NextFireTime}"/>
                               </apex:column>
                             </apex:pageBlockTable>
                             </div>
                            <!--Sheduled Jobs Showing Block-Start-->
                    </apex:outputPanel>

                    <apex:outputPanel rendered="{!NOT(hasScheduledJobs)}">
                    <apex:pageBlockSectionItem >
                        <div>
                            <p>Select the Date and Time to schedule the Automated Test execution</p>              
                        </div>
                    </apex:pageBlockSectionItem>
                    </apex:outputPanel>

                    <apex:pageBlockSectionItem id="ScheduleVal" rendered="{!NOT(hasScheduledJobs)}">
                    <apex:OutputLabel value="Date and Time"/> 
                        <!--<apex:input type="datetime" value="{!startdate}" required="true" /> -->                
                        <apex:InputField required="true" value="{!Automated_Test_Run__c.Schedule__c}" ID="Schdval"/>                      
                    </apex:pageBlockSectionItem>                                      

                    <!-- <apex:commandButton value="Submit" action="{!scheduleJobs}"/> -->
                    <!--<apex:commandButton value="Submit" Action="{!scheduleJobs}">
                    <apex:param name="DttValue" value="{!Automated_Test_Run__c.Schedule__c}" assignTo="{!DtValue}"/>           
                    </apex:commandButton>-->

                    <!--Working BelowComment link-->
                    <apex:commandLink value="Submit" rendered="{!NOT(hasScheduledJobs)}" action="{!scheduleJobs}" styleClass="btn">
                    <apex:param name="DtValue" value="{!Automated_Test_Run__c.Schedule__c}" assignTo="{!DtValue}"/>
                    </apex:commandLink>

                        <!--Working to resolve Pasing value Start
                    <apex:commandButton value="{!Automated_Test_Run__c.Schedule__c}" rendered="{!NOT(hasScheduledJobs)}" onclick="fnChange(this.value);" />
                    
                    <apex:actionFunction id="DTPass" name="DTPass" action="{!scheduleJobs}">
                    <apex:param name="param" assignTo="{!DtValue}" value="{!Automated_Test_Run__c.Schedule__c}" />
                    </apex:actionFunction>                  
                            <!--Working to resolve Pasing value end-->
                            
                    <apex:commandLink value="Cancel" rendered="{!hasScheduledJobs}" action="{!CancelJobs}" styleClass="btn">
                    </apex:commandLink> 
                                
                </apex:pageBlockSection>
                
                <!--Startstics Section -->
          
                <apex:pageBlockSection title="Test Class Execution Statistics" id="Piechartsec" columns="4"> 

                    <apex:pageBlockSectionItem id="ShowGraph">   
                        <apex:outputPanel id="Graph">
                                <apex:chart height="250" width="350" data="{!pieData}" id="Piechartsec2">
                                    <apex:pieSeries dataField="data" labelField="name"/>
                                    <apex:legend position="left"/>
                                </apex:chart>
                            </apex:outputPanel>                                                     
                    </apex:pageBlockSectionItem>                
                    <apex:pageBlockSectionItem id="Refresh">    
                        <apex:commandlink value=" Refresh " status="progress" action="{!Refresh}" styleClass="btn" reRender="Piechartsec2"/>
                        <!-- <apex:commandlink value=" Refresh " status="progress" onclick="window.location.reload();" styleClass="btn" reRender="Piechartsec2"/>-->
                    </apex:pageBlockSectionItem> 

                    <apex:pageBlockSectionItem id="Abort">
                        <apex:commandlink value="Abort" status="progress" action="{!AbortTestJobs}" rendered="{!(hasAbort)}" styleClass="btn" reRender="Piechartsec2"/>
                    </apex:pageBlockSectionItem> 

                        <!--<apex:pageBlockSectionItem id="ShowStaticstics" dataStyle="text-align:center; width: 10%; max-width: 20%;">                 
                    <h1> <p>{!Staticstics}</p> </h1>                    
                    </apex:pageBlockSectionItem> -->
                    
                </apex:pageBlockSection> 
        </apex:pageBlock>
    </apex:form>
</apex:page>
 

****************************************
public with sharing class AutomatedTestSetup_Controller {

    public boolean hasScheduledJobs { get; set; }
    public boolean hasTestRun { get; set; }
    public boolean hasAbort { get; set; }
    public boolean isRunning { get; set; }
    public boolean isEmailing { get; set; }
    public AutomatedTestSetup_Controller ATS { get; set; }
    public String DtValue {get; set; }
    public boolean showMessage {get;set;}
    public String showdatetime{get;set;}
    public String Staticstics{get;set;}
    public List<CronTrigger> Schdjobs{get;set;}
    public List<Shdwrapper> cronjbs{get;set;}
    //public List<Shdwrapper> cronjbs=New List<Shdwrapper>(){get;set;}
    public AutomatedTestSetup_Controller(ApexPages.StandardController controller) {
        showMessage=false;
        refreshHasScheduledJobs();
        refreshHasTestRun();
        ShowAbortbutton();      
    }
    Public class Shdwrapper {
          Public string Name{ get; set; }
          Public Datetime CreatedDate{ get; set; }
          Public Datetime NextFireTime{ get; set; }
          Public string State{ get; set; }
    }
    public void refreshHasScheduledJobs() {
        //integer jobCount = [select count() from CronJobDetail where Name like '%TestRunner%' and JobType = '7'];
        //integer jobCount = [SELECT count() FROM CronTrigger  where CronJobDetail.Name like '%TestRunner%' and State in('WAITING','ACQUIRED','EXECUTING')];
        integer jobCount = [SELECT count() FROM CronTrigger  where CronJobDetail.Name like '%TestRunner%'];
        Schdjobs=[SELECT CronJobDetail.Name,CreatedDate,NextFireTime,State FROM CronTrigger where CronJobDetail.Name like '%TestRunner%' and State in('WAITING','ACQUIRED','EXECUTING')];
        hasScheduledJobs = jobCount !=0; 
        if(hasScheduledJobs==true){
            Shdjobslist(Schdjobs);
            }                    
    }
    Public Void Shdjobslist(list<CronTrigger> Schdjobs){
        //Showing Shedule Jobs on VFp   
         List<Shdwrapper> cronjbs=New List<Shdwrapper>(); 
         if(Schdjobs.size()>0){
                 for(CronTrigger oa : Schdjobs) {
                    //String timeZone = UserInfo.getTimeZone().getID();
                    //Datetime NextDateTime=oa.NextFireTime;
                    
                    Shdwrapper w = new Shdwrapper();
                     w.Name = oa.CronJobDetail.Name;
                     //w.CreatedDate = Datetime.valueOf(CreatedDate);
                     w.NextFireTime = oa.NextFireTime;
                     w.State = oa.State;
                    cronjbs.add(w); 
                }   
         }  
    }
  
    public void refreshHasTestRun() {
        integer runCount = [select count() from Automated_Test_Run__c limit 1];
        hasTestRun = runCount > 0;    
    }
    public void ShowAbortbutton(){
        integer runCount = [select count() from Automated_Test_Run__c limit 1];
        Test_Runner_Job__c RunningJobnm =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c order by CreatedDate desc limit 1];
         integer TestexecrunCount = [select count() from ApexTestQueueItem WHERE Status IN ('Holding','Queued','Preparing','Processing') and ParentJobId=:RunningJobnm.Name];
        hasAbort = TestexecrunCount > 0;    
    }
  
    public string getTestRunLink() {
        return '/' + Automated_Test_Run__c.SObjectType.getDescribe().getKeyPrefix();
    }
  
    public AutomatedTestSetup_Controller() {
        refreshHasScheduledJobs();
        refreshHasTestRun();
    }
  
    public PageReference scheduleJobs() {
        //String InputDtValue = ApexPages.currentPage().getParameters().get('DtValue');
        // System.debug('Date & Time is given***'+InputDtValue);
        System.debug('Date & Time is given***1'+DtValue);
        showMessage=false;
  
        if(DtValue!='null' && DtValue!='' && DtValue!=null ){
             //DateTime Schdtime = (DateTime)Json.deserialize('"'+DtValue+'"', DateTime.class);
             //DtValue Format: Sat Aug 25 17:12:00 GMT 2018
             //0 12 17 25 Aug 2018 Sat
            // 0 12 17 25 AUG ? 2017
            //  Seconds Minutes Hours   Day Of Month    Month   Day Of Week  Year
            //  0        12         17  25              AUG       ?          2017
            deleteCompletedJobs();
            Map <String, Integer> monthNames = new Map <String, Integer> {'Jan'=>1, 'Feb'=>2, 'Mar'=>3, 'Apr'=>4, 'May'=>5, 'Jun'=>6, 'Jul'=>7, 'Aug'=>8, 'Sep'=>9, 'Oct'=>10, 'Nov'=>11, 'Dec'=>12};
            List <String> stringParts = DtValue.split(' ');
            List <String> timeParts = stringParts[3].split(':');

            DateTime DTforSchdle = DateTime.newInstanceGmt(Integer.valueOf(stringParts[5]), monthNames.get(stringParts[1]), Integer.valueOf(stringParts[2]), Integer.valueOf(timeParts[0]), Integer.valueOf(timeParts[1]), Integer.valueOf(timeParts[2]));
            //DTforSchdle ***1-->2018-09-01 14:13:00
            System.debug('DTforSchdle ***'+DTforSchdle);
            //Getting Locle Timezone
             Datetime gmt = DTforSchdle;
             String timeZone = UserInfo.getTimeZone().getID();
             Datetime GivenDateTime=DTforSchdle;// here you can user your dates e.g. createddate
              Datetime local=Datetime.valueOf(GivenDateTime);
              //showdatetime = string.valueOfGmt(local);
              showdatetime=local.format();
              System.debug('@@@@@@@@@@@'+DtValue);
            integer AutomatedEmailScheduleHours=integer.ValueOf(Label.AutomatedEmailScheduleHours);
            DateTime mailschedule= local.addHours(AutomatedEmailScheduleHours);  
            //Datetime mailschedule =DTforSchdle + (AutomatedEmailScheduleHours/24);
            System.debug('mailschedule ***'+mailschedule);         
            //Creating email job Cronexpression
            Map <Integer,String> monthNumbers = new Map <Integer,String> {1=>'Jan', 2=>'Feb',3=>'Mar',4=>'Apr', 5=>'May', 6=>'Jun',7=>'Jul',8=>'Aug', 9=>'Sep', 10=>'Oct', 11=>'Nov', 12=>'Dec'};
            String TestShdmonth=monthNumbers.get(local.month());
            String strSchedule = '0 ' + local.minute() + ' ' +local.hour()+ ' ' + local.day()+ ' ' + TestShdmonth+ ' ? ' + ' ' + local.year();
            System.debug('***strSchedule***'+strSchedule); 
            String emailmonth=monthNumbers.get(mailschedule.month());      
            String strEmailSchedule = '0 ' + mailschedule.minute() + ' ' +mailschedule.hour()+ ' ' + mailschedule.day()+ ' ' + emailmonth+ ' ? ' + ' ' + mailschedule.year();
            System.debug('***strEmailSchedule***'+strEmailSchedule);
            AutoTestRunner.setup(strSchedule,strEmailSchedule);
            refreshHasScheduledJobs();
           //ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Jobs scheduled'));    
        }
        /* else{
             showMessage = true;
             ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.INFO,'Please Select Date Time Value and then Select Submit Button to Schedule job');
                  ApexPages.addMessage(myMsg);
         }*/
    return null;
    }
    
    public PageReference CancelJobs() {     
          //List<CronTrigger> jobsToAbort = [select id,Name from CronJobDetail where Name like 'AutoTestRunner%' and JobType = '7'];
          List<CronTrigger> jobsToAbort = [select Id from CronTrigger where CronJobDetail.JobType = '7' and CronJobDetail.Name like '%TestRunner%'];
              for (CronTrigger job : jobsToAbort) {
               System.abortJob(job.Id);
               }
               
               PageReference pageRef = new PageReference('/apex/AutomatedTestSetupVFP');
                    pageRef.setRedirect(true);
                    return pageRef;
    }
    
    public PageReference AbortTestJobs() {     
        Test_Runner_Job__c RunningJobnm =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c order by CreatedDate desc limit 1];
        ApexTestQueueItem[] items = [SELECT Id FROM ApexTestQueueItem WHERE Status IN ('Holding','Queued','Preparing','Processing') and ParentJobId=:RunningJobnm.Name];
            for(ApexTestQueueItem item: items) {
                item.Status = 'Aborted';
            }
            update items;
            
        PageReference pageRef = new PageReference('/apex/AutomatedTestSetupVFP');
        pageRef.setRedirect(true);
        return pageRef;
    }
 
    public void deleteCompletedJobs(){
        List<CronTrigger> jobsToAbort = [select Id,State from CronTrigger where CronJobDetail.JobType = '7' and CronJobDetail.Name like '%TestRunner%' and State='DELETED'];
              for (CronTrigger job : jobsToAbort) {
               System.abortJob(job.Id);
               }       
    }
    
    public void createTestRun() {
        User currentUser = [select Email from User where Id = :UserInfo.getUserId()];
        insert new Automated_Test_Run__c(Name = 'All Tests', Emails__c = currentUser.Email);
        refreshHasTestRun();
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Automated Test Run created'));
    }
  
    public void run() {
        AutoTestRunner.enqueueTests();
        isRunning = true;
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Tests queued'));
    }
  
    public void email() {
        TestRunnerResults.emailUnprocessedJobStatus();
        isEmailing = true;
        ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.Confirm, 'Results processed and emailed'));
    }
  
//Statistics part
    public List<PieWedgeData> getPieData() {
      //Select id,Status from ApexTestQueueItem where ParentJobId='7070K00008HsU7EQAV'
      //Test_Runner_Job__c RunningJob =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c where Processed__c = false order by CreatedDate desc limit 1];
      //SELECT AsyncApexJobId, Outcome, ApexClass.Name, MethodName, Message, StackTrace FROM ApexTestResult WHERE AsyncApexJobId='7074D00000OEnAAQA1'
      Test_Runner_Job__c RunningJob =[Select Name,Automated_Test_Run__c,CreatedDate From Test_Runner_Job__c order by CreatedDate desc limit 1];
      //integer Cmpltd       = [select count() FROM ApexTestResult WHERE Outcome = 'Pass' and AsyncApexJobId=:RunningJob.Name];
      integer Cmpltd       = [select count() FROM ApexTestResult WHERE Outcome = 'Pass' and AsyncApexJobId=:RunningJob.Name];
      integer Failed       = [select count() FROM ApexTestResult WHERE Outcome = 'Fail' and AsyncApexJobId=:RunningJob.Name];
      integer Queuedjobs   = [select count() FROM ApexTestQueueItem where Status='Queued' and ParentJobId=:RunningJob.Name];
      integer TotalJobs   =  [select count() FROM ApexTestQueueItem where ParentJobId=:RunningJob.Name];
      //Staticstics='Total Testclasses '+TotalJobs+'  '+'Pending Testclasses '+Queuedjobs;
     Staticstics= 'Total Testclasses '+TotalJobs+'\n';
    // Staticstics+= '\n'+'Pending Testclasses '+Queuedjobs+'\n';
     Staticstics+= '\n'+'Test Execution Started on  '+RunningJob.CreatedDate;
            List<PieWedgeData> data = new List<PieWedgeData>();
            data.add(new PieWedgeData('In Progress'+' '+Queuedjobs, +Queuedjobs));
            data.add(new PieWedgeData('Passed'+' '+Cmpltd, +Cmpltd));
            data.add(new PieWedgeData('Fail'+' '+Failed, +Failed));
            
        return data;
    }

    // Wrapper class
    public class PieWedgeData {
       public String name { get; set; }
       public Integer data { get; set; }
       public Integer Cmpltd{ get; set; }
       public Integer Failed{ get; set; }
       public Integer Queuedjobs{ get; set; }
           public PieWedgeData(String name, Integer data) {
                this.name = name;
                this.data = data;
            }
    }
    
    public PageReference Refresh(){ 
         PageReference pageRef = new PageReference('/apex/AutomatedTestSetupVFP');
            pageRef.setRedirect(true);
            return pageRef;
    }
}




No comments:

Post a Comment