package won.protocol.message; import org.apache.jena.query.Dataset; import org.apache.jena.query.Query; import org.apache.jena.query.QueryFactory; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; /** * User: ypanchenko * Date: 02.06.2015 */ public class WonMessageValidator { private static final String resourceDir = "validation/"; private Map<String,List<WonSparqlValidator>> dirToValidator = new LinkedHashMap<>(); public WonMessageValidator() { Map validatorDirs = new HashMap<>(); String[] dirs = { resourceDir + "01_basic/", resourceDir + "02_prop/", resourceDir + "03_chain/", resourceDir + "04_uri/", resourceDir + "05_sign/" }; PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); for (String dir : dirs) { try { List validators = loadResources(resolver, dir); validatorDirs.put(dir, Collections.unmodifiableList(validators)); } catch (IOException e) { throw new RuntimeException(e); } } this.dirToValidator = Collections.unmodifiableMap(validatorDirs); } private List<WonSparqlValidator> loadResources(PathMatchingResourcePatternResolver resolver, String dirString) throws IOException { List validators = new ArrayList<WonSparqlValidator>(); Resource[] resources = resolver.getResources("classpath:" + dirString + "*.rq"); for (Resource resource : resources) { try { String queryString = loadQueryFromResource(resource); Query constraint = QueryFactory.create(queryString); WonSparqlValidator validator = new WonSparqlValidator(constraint, resource.getFilename()); validators.add(validator); } catch (Exception e){ throw new IllegalStateException("Error loading query from resource " + resource.toString(), e); } } return validators; } private String loadQueryFromResource(final Resource resource) { BufferedReader reader = null; StringBuilder sb = new StringBuilder(); String line; try { reader = new BufferedReader(new InputStreamReader(resource.getInputStream(), "UTF-8")); while ((line = reader.readLine()) != null) { sb.append(line); sb.append("\n"); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return sb.toString(); } public boolean validate(Dataset input) { for (String dir : dirToValidator.keySet()) { List<WonSparqlValidator> validators = dirToValidator.get(dir); for (WonSparqlValidator validator : validators) { if (!validator.validate(input).isValid()) { return false; } } } return true; } public boolean validate(Dataset input, StringBuilder causePlaceholder) { for (String dir : dirToValidator.keySet()) { List<WonSparqlValidator> validators = dirToValidator.get(dir); for (WonSparqlValidator validator : validators) { WonSparqlValidator.ValidationResult result = validator.validate(input); if (!result.isValid()) { causePlaceholder.append(dir); causePlaceholder.append(validator.getName()); causePlaceholder.append(": ").append(result.getErrorMessage()); return false; } } } return true; } }