blob: e142b4184a00a61f8999244857fde284ede7f28d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package org.apache.avro;
import java.io.IOException;
import org.apache.avro.io.parsing.ResolvingGrammarGenerator;
import org.apache.avro.io.parsing.Symbol;
/**
* A {@link SchemaValidationStrategy} that checks that the {@link Schema} to
* validate and the existing schema can mutually read each other according to
* the default Avro schema resolution rules.
*
*/
class ValidateMutualRead implements SchemaValidationStrategy {
/**
* Validate that the schemas provided can mutually read data written by each
* other according to the default Avro schema resolution rules.
*
* @throws SchemaValidationException if the schemas are not mutually compatible.
*/
@Override
public void validate(Schema toValidate, Schema existing)
throws SchemaValidationException {
canRead(toValidate, existing);
canRead(existing, toValidate);
}
/**
* Validates that data written with one schema can be read using another,
* based on the default Avro schema resolution rules.
*
* @param writtenWith
* The "writer's" schema, representing data to be read.
* @param readUsing
* The "reader's" schema, representing how the reader will interpret
* data.
* @throws SchemaValidationException
* if the schema <b>readUsing<b/> cannot be used to read data
* written with <b>writtenWith<b/>
*/
static void canRead(Schema writtenWith, Schema readUsing)
throws SchemaValidationException {
boolean error;
try {
error = Symbol.hasErrors(new ResolvingGrammarGenerator().generate(
writtenWith, readUsing));
} catch (IOException e) {
throw new SchemaValidationException(readUsing, writtenWith, e);
}
if (error) {
throw new SchemaValidationException(readUsing, writtenWith);
}
}
}