+ @Override
+ public void onStatementDefinitionDeclared(
+ final Mutable<QName, BaseStatement, EffectiveStatement<QName, BaseStatement>> baseStmtCtx) {
+ final Mutable<?, ?, ?> baseParentCtx = baseStmtCtx.getParentContext();
+ if (StmtContextUtils.producesDeclared(baseParentCtx, IdentityStatement.class)) {
+
+ final QName baseIdentityQName = baseStmtCtx.getStatementArgument();
+ final ModelActionBuilder baseIdentityAction = baseStmtCtx.newInferenceAction(
+ ModelProcessingPhase.STATEMENT_DEFINITION);
+ final Prerequisite<StmtContext<?, ?, ?>> requiresPrereq = baseIdentityAction.requiresCtx(baseStmtCtx,
+ IdentityNamespace.class, baseIdentityQName, ModelProcessingPhase.STATEMENT_DEFINITION);
+ final Prerequisite<StmtContext.Mutable<?, ?, ?>> mutatesPrereq = baseIdentityAction.mutatesCtx(
+ baseParentCtx, ModelProcessingPhase.STATEMENT_DEFINITION);
+
+ baseIdentityAction.apply(new InferenceAction() {
+ @Override
+ public void apply() {
+ List<StmtContext<?, ?, ?>> derivedIdentities =
+ baseStmtCtx.getFromNamespace(DerivedIdentitiesNamespace.class, baseStmtCtx.getStatementArgument());
+ if (derivedIdentities == null) {
+ derivedIdentities = new ArrayList<>();
+ baseStmtCtx.addToNs(DerivedIdentitiesNamespace.class, baseIdentityQName, derivedIdentities);
+ }
+ derivedIdentities.add(baseParentCtx);
+ }
+
+ @Override
+ public void prerequisiteFailed(final Collection<? extends Prerequisite<?>> failed) {
+ throw new InferenceException(baseStmtCtx.getStatementSourceReference(),
+ "Unable to resolve identity %s and base identity %s",
+ baseParentCtx.getStatementArgument(), baseStmtCtx.getStatementArgument());
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onFullDefinitionDeclared(
+ final Mutable<QName, BaseStatement, EffectiveStatement<QName, BaseStatement>> stmt) {
+ super.onFullDefinitionDeclared(stmt);
+ SUBSTATEMENT_VALIDATOR.validate(stmt);
+ }