jobDefinitionEntityLocal = new JobDefinitionEntity(); jobDefinitionEntityLocal.setName(jobName); jobDefinitionEntityLocal.setNamespace(namespaceEntity); jobDefinitionEntityLocal.setDescription(description); jobDefinitionEntityLocal.setActivitiId(activitiId); key = s3PropertiesLocation.getKey(); jobDefinitionEntityLocal.setS3BucketName(bucketName); jobDefinitionEntityLocal.setS3ObjectKey(key); jobDefinitionEntityLocal.setParameters(parameterEntities);
jobDefinition.setId(jobDefinitionEntity.getId()); jobDefinition.setNamespace(jobDefinitionEntity.getNamespace().getCode()); jobDefinition.setJobName(jobDefinitionEntity.getName()); jobDefinition.setDescription(jobDefinitionEntity.getDescription()); String s3BucketName = jobDefinitionEntity.getS3BucketName(); String s3ObjectKey = jobDefinitionEntity.getS3ObjectKey(); if (s3BucketName != null && s3ObjectKey != null) activitiRepositoryService.createProcessDefinitionQuery().processDefinitionId(jobDefinitionEntity.getActivitiId()).singleResult(); jobDefinition.setParameters(parameters); for (JobDefinitionParameterEntity parameterEntity : jobDefinitionEntity.getParameters()) jobDefinition.setLastUpdatedByUserId(jobDefinitionEntity.getUpdatedBy());
/** * Creates and persists a new job definition entity. * * @param namespaceEntity the namespace entity * @param jobName the job name * @param description the job definition description * @param activitiId the job definition Activiti ID * * @return the newly created job definition entity */ public JobDefinitionEntity createJobDefinitionEntity(NamespaceEntity namespaceEntity, String jobName, String description, String activitiId) { JobDefinitionEntity jobDefinitionEntity = new JobDefinitionEntity(); jobDefinitionEntity.setNamespace(namespaceEntity); jobDefinitionEntity.setName(jobName); jobDefinitionEntity.setDescription(description); jobDefinitionEntity.setActivitiId(activitiId); return jobDefinitionDao.saveAndRefresh(jobDefinitionEntity); } }
/** * Gets the parameters from the given {@link JobDefinitionEntity} and {@link JobCreateRequest} and their respective S3 locations provided. If there are any * parameter conflicts, this method will automatically merge them by a predefined precedence, from least to greatest: <ol> <li>Job Definition S3 * location</li> <li>Job Definition parameters</li> <li>Job Create Request S3 location</li> <li>Job Create Request parameters</li> </ol> * * @param jobDefinitionEntity {@link JobDefinitionEntity} * @param jobCreateRequest {@link JobCreateRequest} * * @return merged parameters */ private Map<String, Object> getParameters(JobDefinitionEntity jobDefinitionEntity, JobCreateRequest jobCreateRequest) { Map<String, Object> mergedParameters = new HashMap<>(); // Get parameters from job definition S3 location putParametersFromS3(jobDefinitionEntity.getS3BucketName(), jobDefinitionEntity.getS3ObjectKey(), mergedParameters); // Get parameters from job definition parameters for (JobDefinitionParameterEntity definitionParam : jobDefinitionEntity.getParameters()) { mergedParameters.put(definitionParam.getName(), definitionParam.getValue()); } // Get parameters from job create request S3 location S3PropertiesLocation s3PropertiesLocation = jobCreateRequest.getS3PropertiesLocation(); if (s3PropertiesLocation != null) { putParametersFromS3(s3PropertiesLocation.getBucketName(), s3PropertiesLocation.getKey(), mergedParameters); } // Get parameters from job create request parameters mergedParameters.putAll(toMap(jobCreateRequest.getParameters())); return mergedParameters; }
@SuppressWarnings("unchecked") @Test public void testGetJobsWhenJobStatusNullQueryIgnoreStatus() throws Exception { String namespace = "namespace"; String jobName = "jobName"; JobStatusEnum jobStatus = null; Set<String> authorizedNamespaces = new HashSet<>(Arrays.asList(namespace)); when(namespaceSecurityHelper.getAuthorizedNamespaces(any())).thenReturn(authorizedNamespaces); NamespaceEntity namespaceEntity = new NamespaceEntity(); namespaceEntity.setCode(namespace); when(namespaceDao.getNamespaceByCd(any())).thenReturn(namespaceEntity); List<JobDefinitionEntity> jobDefinitionEntities = new ArrayList<>(); JobDefinitionEntity jobDefinitionEntity1 = new JobDefinitionEntity(); jobDefinitionEntity1.setActivitiId(namespace + "." + jobName + ":1" + ":1"); jobDefinitionEntities.add(jobDefinitionEntity1); when(jobDefinitionDao.getJobDefinitionsByFilter(any(Collection.class), any())).thenReturn(jobDefinitionEntities); when(activitiService.getProcessDefinitionsByIds(any())).thenReturn(asList()); jobServiceImpl.getJobs(namespace, jobName, jobStatus, NO_START_TIME, NO_END_TIME); // Assert neither status filter was called on the query verify(activitiService).getHistoricProcessInstancesCountByStatusAndProcessDefinitionKeys(isNull(JobStatusEnum.class), any(), any(), any()); verify(activitiService).getHistoricProcessInstancesByStatusAndProcessDefinitionKeys(isNull(JobStatusEnum.class), any(), any(), any()); }
/** * Asserts that when a job definition is created using {@link S3PropertiesLocation}, the S3 location information is persisted. * * @throws Exception */ @Test public void testCreateJobDefinitionWithS3PropertiesLocationPersistsEntity() throws Exception { S3PropertiesLocation s3PropertiesLocation = getS3PropertiesLocation(); namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); JobDefinitionCreateRequest request = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); request.setS3PropertiesLocation(s3PropertiesLocation); JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(request, false); Assert.assertEquals("jobDefinition s3PropertiesLocation", request.getS3PropertiesLocation(), jobDefinition.getS3PropertiesLocation()); JobDefinitionEntity jobDefinitionEntity = herdDao.findById(JobDefinitionEntity.class, jobDefinition.getId()); Assert.assertNotNull("jobDefinitionEntity is null", jobDefinitionEntity); Assert.assertEquals("jobDefinitionEntity s3BucketName", s3PropertiesLocation.getBucketName(), jobDefinitionEntity.getS3BucketName()); Assert.assertEquals("jobDefinitionEntity s3ObjectKey", s3PropertiesLocation.getKey(), jobDefinitionEntity.getS3ObjectKey()); }
String processDefinitionKey = String.format("%s.%s", jobDefinitionNamespace, jobDefinitionName); String updatedBy = "updatedBy"; JobDefinitionEntity jobDefinitionEntity = new JobDefinitionEntity(); jobDefinitionEntity.setUpdatedBy(updatedBy);
for (JobDefinitionEntity jobDefinitionEntity : jobDefinitionDao.getJobDefinitionsByFilter(authorizedNamespaces, jobNameTrimmed)) processDefinitionIds.add(jobDefinitionEntity.getActivitiId());
@NamespacePermission(fields = "#request?.namespace", permissions = NamespacePermissionEnum.EXECUTE) @Override public Job createAndStartJob(JobCreateRequest request) throws Exception { // Perform the validation. validateJobCreateRequest(request); // Get the namespace and ensure it exists. NamespaceEntity namespaceEntity = namespaceDaoHelper.getNamespaceEntity(request.getNamespace()); // Get the job definition and ensure it exists. JobDefinitionEntity jobDefinitionEntity = jobDefinitionDao.getJobDefinitionByAltKey(request.getNamespace(), request.getJobName()); if (jobDefinitionEntity == null) { throw new ObjectNotFoundException( "Job definition with name \"" + request.getJobName() + "\" doesn't exist for namespace \"" + request.getNamespace() + "\"."); } // Build the parameters map Map<String, Object> mergedParameters = getParameters(jobDefinitionEntity, request); // Create a process instance holder to check for a handle to the process instance once it is created. String processDefinitionId = jobDefinitionEntity.getActivitiId(); ProcessDefinition processDefinition = activitiService.getProcessDefinitionById(processDefinitionId); Assert.notNull(processDefinition, "No process definition found for Id: " + processDefinitionId); Assert.isTrue(!processDefinition.isSuspended(), "Cannot start process instance for process definition Id: " + processDefinitionId + " because it is suspended."); ProcessInstance processInstance = activitiService.startProcessInstanceByProcessDefinitionId(processDefinitionId, mergedParameters); // If we get here, we have a newly created process instance. Log to know it was created successfully. LOGGER.info("Created process instance with Id: " + processInstance.getProcessInstanceId() + " for process definition Id: " + processDefinitionId + " with merged parameters: " + mergedParameters); // Create and return the job object. return createJobFromRequest(namespaceEntity.getCode(), jobDefinitionEntity.getName(), mergedParameters, processInstance.getProcessInstanceId()); }
/** * Tests an edge case where the job definition was persisted with some S3 properties location, but due to some datafix, the S3 properties location's object * key was removed, but not the bucket name. The service should still work, it would simply ignore the definition's S3 properties location. * * @throws Exception */ @Test public void testCreateJobWithS3PropertiesJobDefinitionWrongDatafixSafety() throws Exception { // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create a job definition create request using hard coded test values. JobDefinitionCreateRequest jobDefinitionCreateRequest = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); jobDefinitionCreateRequest.setS3PropertiesLocation(getS3PropertiesLocation("testBucketName", "testObjectKey", new Parameter("testName", "testValue"))); jobDefinitionCreateRequest.setParameters(null); // Create the job definition. JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(jobDefinitionCreateRequest, false); Integer jobDefinitionId = jobDefinition.getId(); JobDefinitionEntity jobDefinitionEntity = herdDao.findById(JobDefinitionEntity.class, jobDefinitionId); jobDefinitionEntity.setS3ObjectKey(null); // Create a job create request using hard coded test values. JobCreateRequest jobCreateRequest = jobServiceTestHelper.createJobCreateRequest(TEST_ACTIVITI_NAMESPACE_CD, TEST_ACTIVITI_JOB_NAME); jobCreateRequest.setParameters(null); // Create the job. Job resultJob = jobService.createAndStartJob(jobCreateRequest); Assert.assertNotNull("resultJob parameters", resultJob.getParameters()); }
@SuppressWarnings("unchecked") @Test public void testGetJobsWhenActivitiIdIsNotExpectedFormatAssertSuccess() throws Exception { String namespace = "namespace"; String jobName = "jobName"; String processDefinitionKey = String.format("%s.%s", namespace, jobName); when(namespaceSecurityHelper.getAuthorizedNamespaces(any())).thenReturn(new HashSet<>(asList(namespace))); NamespaceEntity namespaceEntity = new NamespaceEntity(); namespaceEntity.setCode(namespace); when(namespaceDao.getNamespaceByCd(any())).thenReturn(namespaceEntity); JobDefinitionEntity jobDefinitionEntity = new JobDefinitionEntity(); jobDefinitionEntity.setNamespace(namespaceEntity); jobDefinitionEntity.setName(jobName); jobDefinitionEntity.setActivitiId("123456"); when(jobDefinitionDao.getJobDefinitionsByFilter(any(Collection.class), any())).thenReturn(asList(jobDefinitionEntity)); ProcessDefinition processDefinition = mock(ProcessDefinition.class); when(processDefinition.getKey()).thenReturn(processDefinitionKey); when(activitiService.getProcessDefinitionsByIds(any())).thenReturn(asList(processDefinition)); jobServiceImpl.getJobs(namespace, jobName, AbstractServiceTest.NO_ACTIVITI_JOB_STATUS, NO_START_TIME, NO_END_TIME); verify(activitiService) .getHistoricProcessInstancesCountByStatusAndProcessDefinitionKeys(any(), equalsCollection(asList(processDefinitionKey)), any(), any()); verify(activitiService) .getHistoricProcessInstancesByStatusAndProcessDefinitionKeys(any(), equalsCollection(asList(processDefinitionKey)), any(), any()); }
JobDefinitionEntity jobDefinitionEntity1 = new JobDefinitionEntity(); jobDefinitionEntity1.setActivitiId(namespace + "." + jobName + ":1" + ":1"); jobDefinitionEntities.add(jobDefinitionEntity1); when(jobDefinitionDao.getJobDefinitionsByFilter(any(Collection.class), any())).thenReturn(jobDefinitionEntities);
/** * Gets the parameters from the given {@link JobDefinitionEntity} and {@link JobCreateRequest} and their respective S3 locations provided. If there are any * parameter conflicts, this method will automatically merge them by a predefined precedence, from least to greatest: <ol> <li>Job Definition S3 * location</li> <li>Job Definition parameters</li> <li>Job Create Request S3 location</li> <li>Job Create Request parameters</li> </ol> * * @param jobDefinitionEntity {@link JobDefinitionEntity} * @param jobCreateRequest {@link JobCreateRequest} * * @return merged parameters */ private Map<String, Object> getParameters(JobDefinitionEntity jobDefinitionEntity, JobCreateRequest jobCreateRequest) { Map<String, Object> mergedParameters = new HashMap<>(); // Get parameters from job definition S3 location putParametersFromS3(jobDefinitionEntity.getS3BucketName(), jobDefinitionEntity.getS3ObjectKey(), mergedParameters); // Get parameters from job definition parameters for (JobDefinitionParameterEntity definitionParam : jobDefinitionEntity.getParameters()) { mergedParameters.put(definitionParam.getName(), definitionParam.getValue()); } // Get parameters from job create request S3 location S3PropertiesLocation s3PropertiesLocation = jobCreateRequest.getS3PropertiesLocation(); if (s3PropertiesLocation != null) { putParametersFromS3(s3PropertiesLocation.getBucketName(), s3PropertiesLocation.getKey(), mergedParameters); } // Get parameters from job create request parameters mergedParameters.putAll(toMap(jobCreateRequest.getParameters())); return mergedParameters; }
@Test public void testUpdateJobDefinitionWithS3PropertiesClear() throws Exception { S3PropertiesLocation s3PropertiesLocation = getS3PropertiesLocation(); // Create the namespace entity. namespaceDaoTestHelper.createNamespaceEntity(TEST_ACTIVITI_NAMESPACE_CD); // Create job definition create request using hard coded test values. JobDefinitionCreateRequest createRequest = jobDefinitionServiceTestHelper.createJobDefinitionCreateRequest(); createRequest.setS3PropertiesLocation(s3PropertiesLocation); // Create the job definition in the database. JobDefinition jobDefinition = jobDefinitionService.createJobDefinition(createRequest, false); // Create an update request with a varied set of data that is based on the same data used in the create request. JobDefinitionUpdateRequest updateRequest = createUpdateRequest(createRequest); // Update the job definition in the database. JobDefinition updatedJobDefinition = jobDefinitionService.updateJobDefinition(createRequest.getNamespace(), createRequest.getJobName(), updateRequest, false); JobDefinitionEntity updatedJobDefinitionEntity = herdDao.findById(JobDefinitionEntity.class, updatedJobDefinition.getId()); // Validate the updated job definition. assertEquals(new JobDefinition(jobDefinition.getId(), jobDefinition.getNamespace(), jobDefinition.getJobName(), updateRequest.getDescription(), updateRequest.getActivitiJobXml(), updateRequest.getParameters(), null, HerdDaoSecurityHelper.SYSTEM_USER), updatedJobDefinition); // Validate the updated job definition entity. Assert.assertNull("updatedJobDefinitionEntity s3BucketName", updatedJobDefinitionEntity.getS3BucketName()); Assert.assertNull("updatedJobDefinitionEntity s3ObjectKey", updatedJobDefinitionEntity.getS3ObjectKey()); }
String processDefinitionKey = String.format("%s.%s", jobDefinitionNamespace, jobDefinitionName); String updatedBy = "updatedBy"; JobDefinitionEntity jobDefinitionEntity = new JobDefinitionEntity(); jobDefinitionEntity.setUpdatedBy(updatedBy);
for (JobDefinitionEntity jobDefinitionEntity : jobDefinitionDao.getJobDefinitionsByFilter(authorizedNamespaces, jobNameTrimmed)) processDefinitionIds.add(jobDefinitionEntity.getActivitiId());
@NamespacePermission(fields = "#request?.namespace", permissions = NamespacePermissionEnum.EXECUTE) @Override public Job createAndStartJob(JobCreateRequest request) throws Exception { // Perform the validation. validateJobCreateRequest(request); // Get the namespace and ensure it exists. NamespaceEntity namespaceEntity = namespaceDaoHelper.getNamespaceEntity(request.getNamespace()); // Get the job definition and ensure it exists. JobDefinitionEntity jobDefinitionEntity = jobDefinitionDao.getJobDefinitionByAltKey(request.getNamespace(), request.getJobName()); if (jobDefinitionEntity == null) { throw new ObjectNotFoundException( "Job definition with name \"" + request.getJobName() + "\" doesn't exist for namespace \"" + request.getNamespace() + "\"."); } // Build the parameters map Map<String, Object> mergedParameters = getParameters(jobDefinitionEntity, request); // Create a process instance holder to check for a handle to the process instance once it is created. String processDefinitionId = jobDefinitionEntity.getActivitiId(); ProcessDefinition processDefinition = activitiService.getProcessDefinitionById(processDefinitionId); Assert.notNull(processDefinition, "No process definition found for Id: " + processDefinitionId); Assert.isTrue(!processDefinition.isSuspended(), "Cannot start process instance for process definition Id: " + processDefinitionId + " because it is suspended."); ProcessInstance processInstance = activitiService.startProcessInstanceByProcessDefinitionId(processDefinitionId, mergedParameters); // If we get here, we have a newly created process instance. Log to know it was created successfully. LOGGER.info("Created process instance with Id: " + processInstance.getProcessInstanceId() + " for process definition Id: " + processDefinitionId + " with merged parameters: " + mergedParameters); // Create and return the job object. return createJobFromRequest(namespaceEntity.getCode(), jobDefinitionEntity.getName(), mergedParameters, processInstance.getProcessInstanceId()); }
jobDefinitionEntityLocal = new JobDefinitionEntity(); jobDefinitionEntityLocal.setName(jobName); jobDefinitionEntityLocal.setNamespace(namespaceEntity); jobDefinitionEntityLocal.setDescription(description); jobDefinitionEntityLocal.setActivitiId(activitiId); key = s3PropertiesLocation.getKey(); jobDefinitionEntityLocal.setS3BucketName(bucketName); jobDefinitionEntityLocal.setS3ObjectKey(key); jobDefinitionEntityLocal.setParameters(parameterEntities);
jobDefinition.setId(jobDefinitionEntity.getId()); jobDefinition.setNamespace(jobDefinitionEntity.getNamespace().getCode()); jobDefinition.setJobName(jobDefinitionEntity.getName()); jobDefinition.setDescription(jobDefinitionEntity.getDescription()); String s3BucketName = jobDefinitionEntity.getS3BucketName(); String s3ObjectKey = jobDefinitionEntity.getS3ObjectKey(); if (s3BucketName != null && s3ObjectKey != null) activitiRepositoryService.createProcessDefinitionQuery().processDefinitionId(jobDefinitionEntity.getActivitiId()).singleResult(); jobDefinition.setParameters(parameters); for (JobDefinitionParameterEntity parameterEntity : jobDefinitionEntity.getParameters()) jobDefinition.setLastUpdatedByUserId(jobDefinitionEntity.getUpdatedBy());
JobDefinitionEntity jobDefinitionEntity1 = new JobDefinitionEntity(); jobDefinitionEntity1.setActivitiId(namespace + "." + jobName + ":1" + ":1"); jobDefinitionEntities.add(jobDefinitionEntity1); when(jobDefinitionDao.getJobDefinitionsByFilter(any(Collection.class), any())).thenReturn(jobDefinitionEntities);