public static Properties merge(@NotNull Properties change, Properties current) {
    Checks.notNull(change, "cannot merge a null change with the current properties");
    if (current == null) {
      return change;
    }

    Properties newSnapshot = new Properties();
    newSnapshot.setOwner(change.owner != null ? change.owner : current.owner);
    newSnapshot.setAccessControl(
        change.accessControl != null ? change.accessControl : current.accessControl);
    newSnapshot.setRunStrategy(
        change.runStrategy != null ? change.runStrategy : current.runStrategy);
    newSnapshot.setStepConcurrency(
        change.stepConcurrency != null ? change.stepConcurrency : current.stepConcurrency);
    newSnapshot.setAlerting(change.alerting != null ? change.alerting : current.alerting);
    newSnapshot.setAlertingDisabled(
        change.alertingDisabled != null ? change.alertingDisabled : current.alertingDisabled);
    newSnapshot.setSignalTriggerDisabled(
        change.signalTriggerDisabled != null
            ? change.signalTriggerDisabled
            : current.signalTriggerDisabled);
    newSnapshot.setTimeTriggerDisabled(
        change.timeTriggerDisabled != null
            ? change.timeTriggerDisabled
            : current.timeTriggerDisabled);
    newSnapshot.setDescription(
        change.description != null ? change.description : current.description);
    newSnapshot.setTags(change.tags != null ? change.tags : current.tags);
    return newSnapshot;
  }
@Test
  public void testMerge() throws Exception {
    Properties from =
        loadObject("fixtures/workflows/definition/sample-properties.json", Properties.class);
    Properties empty = new Properties();
    assertEquals(from, Properties.merge(from, null));

    Properties to = Properties.merge(from, empty);
    assertEquals(from, to);
  }