private static JsonObject substituteInitialPolicy(final JsonObject initialPolicy, final HeaderBasedPlaceholderSubstitutionAlgorithm substitutionAlgorithm, final DittoHeaders dittoHeaders) { Policy existingPolicy; try { existingPolicy = PoliciesModelFactory.newPolicy(initialPolicy); } catch (final RuntimeException e) { // Just log to debug, error is handled somewhere else LOGGER.debug("Failed to parse initial policy.", e); return initialPolicy; } final Policy substitutedPolicy = substitutePolicy(existingPolicy, substitutionAlgorithm, dittoHeaders); return substitutedPolicy.toJson(); } }
@Override public WithDittoHeaders apply(final ModifyThing modifyThing, final HeaderBasedPlaceholderSubstitutionAlgorithm substitutionAlgorithm) { requireNonNull(modifyThing); requireNonNull(substitutionAlgorithm); final DittoHeaders dittoHeaders = modifyThing.getDittoHeaders(); final JsonObject inlinePolicyJson = modifyThing.getInitialPolicy().orElse(null); final JsonObject substitutedInlinePolicyJson; if (inlinePolicyJson == null) { substitutedInlinePolicyJson = null; } else { substitutedInlinePolicyJson = substituteInitialPolicy(inlinePolicyJson, substitutionAlgorithm, dittoHeaders); } final Thing existingThing = modifyThing.getThing(); final Thing substitutedThing = substituteThing(existingThing, substitutionAlgorithm, dittoHeaders); if (existingThing.equals(substitutedThing) && Objects.equals(inlinePolicyJson, substitutedInlinePolicyJson)) { return modifyThing; } else { return ModifyThing.of(modifyThing.getThingId(), substitutedThing, substitutedInlinePolicyJson, modifyThing.getPolicyIdOrPlaceholder().orElse(null), dittoHeaders); } }
private static List<SubstitutionStrategy> createStrategies() { final List<SubstitutionStrategy> strategies = new LinkedList<>(); // replacement for policy-subject-id strategies.add(new ModifySubjectSubstitutionStrategy()); strategies.add(new ModifySubjectsSubstitutionStrategy()); strategies.add(new ModifyPolicyEntrySubstitutionStrategy()); strategies.add(new ModifyPolicyEntriesSubstitutionStrategy()); strategies.add(new ModifyPolicySubstitutionStrategy()); strategies.add(new CreatePolicySubstitutionStrategy()); // replacement for acl-subject-id strategies.add(new ModifyAclEntrySubstitutionStrategy()); strategies.add(new ModifyAclSubstitutionStrategy()); // replacement for both policy-subject-id and acl-subject-id strategies.add(new ModifyThingSubstitutionStrategy()); strategies.add(new CreateThingSubstitutionStrategy()); return strategies; } }