docs: public static JSLJob buildPartitionLevelJSLJob(long topLevelJobExecutionId, Properties jobProperties, Step step, int partitionInstance) {
  
          ObjectFactory jslFactory = new ObjectFactory();
          JSLJob subJob = jslFactory.createJSLJob();
          
          // Uses the top-level job execution id.   Note the RI used to use the INSTANCE id, so this is 
          // a big change.
          String subJobId = generateSubJobId(topLevelJobExecutionId, step.getId(), partitionInstance);
          subJob.setId(subJobId);
          
          //Copy all job properties (from parent JobContext) to partitioned step threads
          subJob.setProperties(CloneUtility.javaPropsTojslProperties(jobProperties));
  
          // Add one step to job
          Step newStep = jslFactory.createStep();
          
          //set id
          newStep.setId(step.getId());
          
          /***
           * deep copy all fields in a step
           */
          // Not used at partition level
          //newStep.setAllowStartIfComplete(step.getAllowStartIfComplete());
          
          if (step.getBatchlet() != null){
          	newStep.setBatchlet(CloneUtility.cloneBatchlet(step.getBatchlet()));
          }
          
          if (step.getChunk() != null) {
          	newStep.setChunk(CloneUtility.cloneChunk(step.getChunk()));
          }
          
          // Do not copy next attribute and control elements.  Transitioning should ONLY
          // take place on the main thread.
          
          //Do not add step listeners, only call them on parent thread.
  
          //Add partition artifacts and set instances to 1 as the base case 
          Partition partition = step.getPartition();
          if (partition != null) {
          	if (partition.getCollector() != null) {
          		
          		Partition basePartition = jslFactory.createPartition();
          		
          		PartitionPlan partitionPlan = jslFactory.createPartitionPlan();
          		partitionPlan.setPartitions(null);
          		basePartition.setPlan(partitionPlan);
          		
          		basePartition.setCollector(partition.getCollector());
          		newStep.setPartition(basePartition);
                  	
          	}
          }
          
          // Not used at partition level
          //newStep.setStartLimit(step.getStartLimit());
          newStep.setProperties(CloneUtility.cloneJSLProperties(step.getProperties()));
          
          // Don't try to only clone based on type (e.g. ChunkListener vs. StepListener).
          // We don't know the type at the model level, and a given artifact could implement more
          // than one listener interface (e.g. ChunkListener AND StepListener).
          newStep.setListeners(CloneUtility.cloneListeners(step.getListeners()));       
          
          //Add Step properties, need to be careful here to remember the right precedence
          
          subJob.getExecutionElements().add(newStep);
  
  
          return subJob;
      }