001/* 002 * SPDX-License-Identifier: Apache-2.0 003 * 004 * Copyright 2024-2026 The Enola <https://enola.dev> Authors 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package dev.enola.thing.validation; 019 020import com.google.common.collect.ImmutableList; 021 022import dev.enola.thing.PredicatesObjects; 023import dev.enola.thing.Thing; 024import dev.enola.thing.repo.ThingRepository; 025 026public class Validators { 027 028 private final ImmutableList<Validator<PredicatesObjects>> validators; 029 030 Validators(Validator<PredicatesObjects>... validators) { 031 this.validators = ImmutableList.copyOf(validators); 032 } 033 034 public Validators(ThingRepository repo) { 035 this(new LinksValidator(repo)); 036 } 037 038 public void validate(ThingRepository repository, Collector2 collector) { 039 validate(repository.list(), collector); 040 } 041 042 public void validate(Iterable<Thing> things, Collector2 collector) { 043 // TODO #performance Multi-threaded parallelized implementation? 044 for (Thing thing : things) { 045 validate(thing, collector); 046 } 047 } 048 049 private void validate(Thing root, Collector2 collector) { 050 // TODO #performance Multi-threaded parallelized implementation? 051 for (var validator : validators) { 052 validator.validate(root, new InternalCollector(root, collector)); 053 } 054 } 055 056 private static class InternalCollector implements Collector { 057 058 private final Thing thing; 059 private final Collector2 collector2; 060 061 private InternalCollector(Thing thing, Collector2 collector2) { 062 this.collector2 = collector2; 063 this.thing = thing; 064 } 065 066 @Override 067 public void add(String predicateIRI, String message) { 068 collector2.add(thing, predicateIRI, message); 069 } 070 } 071}