@Override
	public boolean submitJob(JobConf jobConf) throws FileNotFoundException, IOException {
		//1. Check if the Job Configuration is Valid
		if(jobConf == null || !IsJobConfValid(jobConf))
		{
			System.out.println("Invalid Job Configuration Submitted. Please check your Job Source Code and Config");
			return false;
		}

		boolean IsFilePartitioned = false;

		if(!nameNodeMasterReference.checkFileExistence(jobConf.getInputPath()))
		{
			//Request to Partition the File
			IsFilePartitioned = this.nameNodeSlaveReference.dump(jobConf.getInputPath());
		}
		else
		{
			IsFilePartitioned = true;
		}

		if(IsFilePartitioned)
		{
			// If the file is broken-up and ready. No-worries then. Proceed with sending command to JobTracker 
			//Piggyback on this JobId to Report Progress for the Client about the Job that he request to Run
			int uniqueJobID = requestJobIDfromJobTracker();
			if(uniqueJobID <= 0)
			{
				System.out.println("The system is not available for submitting new job.");
				return false;
			} else {
				jobConf.setJobID(uniqueJobID);
				jobConf.setJobRequestOriginHostName(identifer);
			}

			if(jobConf.getJobName() == null || jobConf.getJobName().length() == 0)
				jobConf.setJobName(String.valueOf(uniqueJobID));

			try {
				if (this.jobTrackerServiceProvider.submitJob(jobConf)) 	    
				{
					System.out.println("JobClient submmited Job successfully. Monitoring status...");

					this.monitorandPrintJobInfoandMoveFile(uniqueJobID,jobConf.getOutputPath());

					return true;
				}
				else
				{
					System.out.println("Failed to submit this job to the Job Tracker");
				}
			} 
			catch (RemoteException | InterruptedException e) 
			{
				System.out.println("Error occured while submitting the job");
			}
			return false;
		}
		else
		{
			System.out.println("Unable to partition the file. Either the file is not present or file is corrupt");
			return false;
		}
	}