private List<Workflow> getBatchOfWorkflows(final List<WorkflowId> batch) throws IOException { final List<Key> keys = batch.stream() .map(workflowId -> workflowKey(datastore.newKeyFactory(), workflowId)) .collect(toList()); final List<Workflow> workflows = new ArrayList<>(); datastore.get(keys, entity -> { try { workflows.add(OBJECT_MAPPER.readValue(entity.getString(PROPERTY_WORKFLOW_JSON), Workflow.class)); } catch (IOException e) { LOG.warn("Failed to read workflow {}.", entity.getKey(), e); } }); return workflows; }
Optional<Workflow> workflow(WorkflowId workflowId) throws IOException { final Optional<Entity> entityOptional = getOpt(datastore, workflowKey(datastore.newKeyFactory(), workflowId)) .filter(e -> e.contains(PROPERTY_WORKFLOW_JSON)); if (entityOptional.isPresent()) { return Optional.of(parseWorkflowJson(entityOptional.get(), workflowId)); } else { return Optional.empty(); } }
boolean enabled(WorkflowId workflowId) throws IOException { final Key workflowKey = workflowKey(datastore.newKeyFactory(), workflowId); return getOpt(datastore, workflowKey) .filter(w -> w.contains(PROPERTY_WORKFLOW_ENABLED)) .map(workflow -> workflow.getBoolean(PROPERTY_WORKFLOW_ENABLED)) .orElse(DEFAULT_WORKFLOW_ENABLED); }
@Override public Optional<Workflow> workflow(WorkflowId workflowId) throws IOException { final Optional<Entity> entityOptional = DatastoreStorage.getOpt(tx, DatastoreStorage.workflowKey(tx.getDatastore().newKeyFactory(), workflowId)); if (entityOptional.isPresent()) { return Optional.of(DatastoreStorage.parseWorkflowJson(entityOptional.get(), workflowId)); } else { return Optional.empty(); } }
void delete(WorkflowId workflowId) throws IOException { storeWithRetries(() -> { datastore.delete(workflowKey(datastore.newKeyFactory(), workflowId)); return null; }); }
public WorkflowState workflowState(WorkflowId workflowId) throws IOException { final WorkflowState.Builder builder = WorkflowState.builder(); final Optional<Entity> workflowEntity = getOpt(datastore, workflowKey(datastore.newKeyFactory(), workflowId)); builder.enabled(workflowEntity.filter(w -> w.contains(PROPERTY_WORKFLOW_ENABLED)) .map(workflow -> workflow.getBoolean(PROPERTY_WORKFLOW_ENABLED)) .orElse(DEFAULT_WORKFLOW_ENABLED)); getOptInstantProperty(workflowEntity, PROPERTY_NEXT_NATURAL_TRIGGER) .ifPresent(builder::nextNaturalTrigger); getOptInstantProperty(workflowEntity, PROPERTY_NEXT_NATURAL_OFFSET_TRIGGER) .ifPresent(builder::nextNaturalOffsetTrigger); return builder.build(); }
@Override public WorkflowId patchState(WorkflowId workflowId, WorkflowState state) throws IOException { final Key workflowKey = DatastoreStorage .workflowKey(tx.getDatastore().newKeyFactory(), workflowId); final Optional<Entity> workflowOpt = DatastoreStorage.getOpt(tx, workflowKey); if (!workflowOpt.isPresent()) { throw new ResourceNotFoundException( String.format("%s:%s doesn't exist.", workflowId.componentId(), workflowId.id())); } final Entity.Builder builder = Entity.newBuilder(workflowOpt.get()); state.enabled().ifPresent(x -> builder.set(PROPERTY_WORKFLOW_ENABLED, x)); state.nextNaturalTrigger() .ifPresent(x -> builder.set(PROPERTY_NEXT_NATURAL_TRIGGER, instantToTimestamp(x))); state.nextNaturalOffsetTrigger() .ifPresent(x -> builder.set(PROPERTY_NEXT_NATURAL_OFFSET_TRIGGER, instantToTimestamp(x))); tx.put(builder.build()); return workflowId; }
@Override public WorkflowId updateNextNaturalTrigger(WorkflowId workflowId, TriggerInstantSpec triggerSpec) throws IOException { final Key workflowKey = DatastoreStorage .workflowKey(tx.getDatastore().newKeyFactory(), workflowId); final Optional<Entity> workflowOpt = DatastoreStorage.getOpt(tx, workflowKey); if (!workflowOpt.isPresent()) { throw new ResourceNotFoundException( String.format("%s:%s doesn't exist.", workflowId.componentId(), workflowId.id())); } final Entity.Builder builder = Entity .newBuilder(workflowOpt.get()) .set(PROPERTY_NEXT_NATURAL_TRIGGER, instantToTimestamp(triggerSpec.instant())) .set(PROPERTY_NEXT_NATURAL_OFFSET_TRIGGER, instantToTimestamp(triggerSpec.offsetInstant())); tx.put(builder.build()); return workflowId; }
@Override public WorkflowId store(Workflow workflow) throws IOException { final Key componentKey = DatastoreStorage.componentKey(tx.getDatastore().newKeyFactory(), workflow.componentId()); if (tx.get(componentKey) == null) { tx.put(Entity.newBuilder(componentKey).build()); } final String json = OBJECT_MAPPER.writeValueAsString(workflow); final Key workflowKey = DatastoreStorage.workflowKey(tx.getDatastore().newKeyFactory(), workflow.id()); final Optional<Entity> workflowOpt = DatastoreStorage.getOpt(tx, workflowKey); final Entity workflowEntity = DatastoreStorage.asBuilderOrNew(workflowOpt, workflowKey) .set(PROPERTY_WORKFLOW_JSON, StringValue.newBuilder(json).setExcludeFromIndexes(true).build()) .build(); tx.put(workflowEntity); return workflow.id(); }
@Override public WorkflowId storeWorkflowWithNextNaturalTrigger(Workflow workflow, TriggerInstantSpec triggerSpec) throws IOException { final Key componentKey = DatastoreStorage.componentKey(tx.getDatastore().newKeyFactory(), workflow.componentId()); if (tx.get(componentKey) == null) { tx.put(Entity.newBuilder(componentKey).build()); } final String json = OBJECT_MAPPER.writeValueAsString(workflow); final Key workflowKey = DatastoreStorage.workflowKey(tx.getDatastore().newKeyFactory(), workflow.id()); final Optional<Entity> workflowOpt = DatastoreStorage.getOpt(tx, workflowKey); final Builder entity = DatastoreStorage.asBuilderOrNew(workflowOpt, workflowKey) .set(PROPERTY_WORKFLOW_JSON, StringValue.newBuilder(json).setExcludeFromIndexes(true).build()) .set(PROPERTY_NEXT_NATURAL_TRIGGER, instantToTimestamp(triggerSpec.instant())) .set(PROPERTY_NEXT_NATURAL_OFFSET_TRIGGER, instantToTimestamp(triggerSpec.offsetInstant())); tx.put(entity.build()); return workflow.id(); }