private void validate30RawProfileActivation()

in compat/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java [264:356]


    private void validate30RawProfileActivation(ModelProblemCollector problems, Activation activation, String prefix) {
        if (activation == null) {
            return;
        }
        class ActivationFrame {
            String location;
            Optional<? extends InputLocationTracker> parent;

            ActivationFrame(String location, Optional<? extends InputLocationTracker> parent) {
                this.location = location;
                this.parent = parent;
            }
        }
        final Deque<ActivationFrame> stk = new LinkedList<>();

        final Supplier<String> pathSupplier = () -> {
            final boolean parallel = false;
            return StreamSupport.stream(((Iterable<ActivationFrame>) stk::descendingIterator).spliterator(), parallel)
                    .map(f -> f.location)
                    .collect(Collectors.joining("."));
        };
        final Supplier<InputLocation> locationSupplier = () -> {
            if (stk.size() < 2) {
                return null;
            }
            Iterator<ActivationFrame> f = stk.iterator();

            String location = f.next().location;
            ActivationFrame parent = f.next();

            return parent.parent.map(p -> p.getLocation(location)).orElse(null);
        };
        final Consumer<String> validator = s -> {
            if (hasProjectExpression(s)) {
                String path = pathSupplier.get();
                Matcher matcher = EXPRESSION_PROJECT_NAME_PATTERN.matcher(s);
                while (matcher.find()) {
                    String propertyName = matcher.group(0);

                    if (path.startsWith("activation.file.") && "${project.basedir}".equals(propertyName)) {
                        continue;
                    }
                    addViolation(
                            problems,
                            Severity.WARNING,
                            Version.V30,
                            prefix + path,
                            null,
                            "Failed to interpolate profile activation property " + s + ": " + propertyName
                                    + " expressions are not supported during profile activation.",
                            locationSupplier.get());
                }
            }
        };
        Optional<Activation> root = Optional.of(activation);
        stk.push(new ActivationFrame("activation", root));
        root.map(Activation::getFile).ifPresent(fa -> {
            stk.push(new ActivationFrame("file", Optional.of(fa)));
            stk.push(new ActivationFrame("exists", Optional.empty()));
            validator.accept(fa.getExists());
            stk.peek().location = "missing";
            validator.accept(fa.getMissing());
            stk.pop();
            stk.pop();
        });
        root.map(Activation::getOs).ifPresent(oa -> {
            stk.push(new ActivationFrame("os", Optional.of(oa)));
            stk.push(new ActivationFrame("arch", Optional.empty()));
            validator.accept(oa.getArch());
            stk.peek().location = "family";
            validator.accept(oa.getFamily());
            stk.peek().location = "name";
            validator.accept(oa.getName());
            stk.peek().location = "version";
            validator.accept(oa.getVersion());
            stk.pop();
            stk.pop();
        });
        root.map(Activation::getProperty).ifPresent(pa -> {
            stk.push(new ActivationFrame("property", Optional.of(pa)));
            stk.push(new ActivationFrame("name", Optional.empty()));
            validator.accept(pa.getName());
            stk.peek().location = "value";
            validator.accept(pa.getValue());
            stk.pop();
            stk.pop();
        });
        root.map(Activation::getJdk).ifPresent(jdk -> {
            stk.push(new ActivationFrame("jdk", Optional.empty()));
            validator.accept(jdk);
            stk.pop();
        });
    }