class JobConfigurationObjectBundleHook extends AbstractObjectBundleHook {

    List<ErrorReport> validateInternal( final JobConfiguration jobConfiguration )
    {
        List<ErrorReport> errorReports = new ArrayList<>();

        // Check whether jobConfiguration already exists in the system and if so validate it

        JobConfiguration persistedJobConfiguration = jobConfigurationService.getJobConfigurationByUid( jobConfiguration.getUid() );

        final JobConfiguration tempJobConfiguration = validatePersistedAndPrepareTempJobConfiguration( errorReports,
            jobConfiguration, persistedJobConfiguration );

        validateJobConfigurationCronOrFixedDelay( errorReports, tempJobConfiguration );
        validateCronExpressionWithinJobType( errorReports, tempJobConfiguration );

        // Validate parameters

        if ( tempJobConfiguration.getJobParameters() != null )
        {
            tempJobConfiguration.getJobParameters().validate().ifPresent( errorReports::add );
        }
        else
        {
            // Report error if JobType requires JobParameters, but it does not exist in JobConfiguration

            if ( tempJobConfiguration.getJobType().hasJobParameters() )
            {
                errorReports.add( new ErrorReport( this.getClass(), ErrorCode.E4029, tempJobConfiguration.getJobType() ) );
            }
        }

        validateJob( errorReports, tempJobConfiguration, persistedJobConfiguration );

        return errorReports;
    }

    public  JobConfigurationObjectBundleHook( JobConfigurationService jobConfigurationService,
        SchedulingManager schedulingManager );

}