Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (c) 2014, Francis Galiegue (fgaliegue@gmail.com)
   *
   * This software is dual-licensed under:
   *
   * - the Lesser General Public License (LGPL) version 3.0 or, at your option, any
   *   later version;
   * - the Apache Software License (ASL) version 2.0.
   *
  * The text of this file and of both licenses is available at the root of this
  * project or, if you have the jar distribution, in directory META-INF/, under
  * the names LGPL-3.0.txt and ASL-2.0.txt respectively.
  *
  * Direct link to the sources:
  *
  * - LGPL 3.0: https://www.gnu.org/licenses/lgpl-3.0.txt
  * - ASL 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
  */
 
 package com.github.fge.jsonschema.processors.validation;
 
 
 import java.util.List;

Main validation processor
 
 public final class ValidationProcessor
     implements Processor<FullDataFullData>
 {
     private final MessageBundle syntaxMessages;
     private final MessageBundle validationMessages;
     private final Processor<SchemaContextValidatorListprocessor;
     private final LoadingCache<JsonNodeArraySchemaSelectorarrayCache;
 
     public ValidationProcessor(final ValidationConfiguration cfg,
         final Processor<SchemaContextValidatorListprocessor)
     {
          = cfg.getSyntaxMessages();
          = cfg.getValidationMessages();
         this. = new CachingProcessor<SchemaContextValidatorList>(
             processor, SchemaContextEquivalence.getInstance()
         );
          = CacheBuilder.newBuilder().build(arrayLoader());
          = CacheBuilder.newBuilder().build(objectLoader());
     }
 
     @Override
     public FullData process(final ProcessingReport report,
         final FullData input)
         throws ProcessingException
     {
         /*
          * Build a validation context, attach a report to it
          */
         final SchemaContext context = new SchemaContext(input);
 
         /*
          * Get the full context from the cache. Inject the messages into the
          * main report.
          */
         final ValidatorList fullContext = .process(reportcontext);
 
         if (fullContext == null) {
             /*
              * OK, that's for issue #99 but that's ugly nevertheless.
              *
              * We want syntax error messages to appear in the exception text.
              */
             final String msg = .getMessage("core.invalidSchema");
             final ArrayNode arrayNode = JacksonUtils.nodeFactory().arrayNode();
             JsonNode node;
             for (final ProcessingMessage messagereport) {
                 node = message.asJson();
                 if ("syntax".equals(node.path("domain").asText()))
                    arrayNode.add(node);
            }
            final StringBuilder sb = new StringBuilder(msg);
            sb.append("\nSyntax errors:\n");
            sb.append(JacksonUtils.prettyPrint(arrayNode));
            final ProcessingMessage message = new ProcessingMessage()
                .setMessage(sb.toString());
            throw new InvalidSchemaException(message);
        }
        /*
         * Get the calculated context. Build the data.
         */
        final SchemaContext newContext = fullContext.getContext();
        final FullData data = new FullData(newContext.getSchema(),
            input.getInstance(), input.isDeepCheck());
        /*
         * Validate against all keywords.
         */
        for (final KeywordValidator validatorfullContext)
            validator.validate(thisreportdata);
        /*
         * At that point, if the report is a failure, we quit: there is no
         * reason to go any further. Unless the user has asked to continue even
         * in this case.
         */
        if (!(report.isSuccess() || data.isDeepCheck()))
            return input;
        /*
         * Now check whether this is a container node with a size greater than
         * 0. If not, no need to go see the children.
         */
        final JsonNode node = data.getInstance().getNode();
        if (node.size() == 0)
            return input;
        if (node.isArray())
            processArray(reportdata);
        else
            processObject(reportdata);
        return input;
    }
    private void processArray(final ProcessingReport report,
        final FullData input)
        throws ProcessingException
    {
        final SchemaTree tree = input.getSchema();
        final JsonTree instance = input.getInstance();
        final JsonNode schema = tree.getNode();
        final JsonNode node = instance.getNode();
        final JsonNode digest = ArraySchemaDigester.getInstance().digest(schema);
        final ArraySchemaSelector selector = .getUnchecked(digest);
        final int size = node.size();
        FullData data;
        JsonTree newInstance;
        for (int index = 0; index < sizeindex++) {
            newInstance = instance.append(JsonPointer.of(index));
            data = input.withInstance(newInstance);
            for (final JsonPointer ptrselector.selectSchemas(index)) {
                data = data.withSchema(tree.append(ptr));
                process(reportdata);
            }
        }
    }
    private void processObject(final ProcessingReport report,
        final FullData input)
        throws ProcessingException
    {
        final SchemaTree tree = input.getSchema();
        final JsonTree instance = input.getInstance();
        final JsonNode schema = tree.getNode();
        final JsonNode node = instance.getNode();
        final JsonNode digest = ObjectSchemaDigester.getInstance()
            .digest(schema);
        final ObjectSchemaSelector selector = .getUnchecked(digest);
        final List<Stringfields = Lists.newArrayList(node.fieldNames());
        Collections.sort(fields);
        FullData data;
        JsonTree newInstance;
        for (final String fieldfields) {
            newInstance = instance.append(JsonPointer.of(field));
            data = input.withInstance(newInstance);
            for (final JsonPointer ptrselector.selectSchemas(field)) {
                data = data.withSchema(tree.append(ptr));
                process(reportdata);
            }
        }
    }
    {
        return new CacheLoader<JsonNodeArraySchemaSelector>()
        {
            @Override
            public ArraySchemaSelector load(final JsonNode key)
            {
                return new ArraySchemaSelector(key);
            }
        };
    }
    {
        return new CacheLoader<JsonNodeObjectSchemaSelector>()
        {
            @Override
            public ObjectSchemaSelector load(final JsonNode key)
            {
                return new ObjectSchemaSelector(key);
            }
        };
    }
    @Override
    public String toString()
    {
        return "validation processor";
    }
New to GrepCode? Check out our FAQ X