/*
* Copyright (c) MuleSoft, Inc.
*
* Licensed 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.raml.parser.visitor;
import static org.raml.parser.visitor.TupleType.KEY;
import java.lang.reflect.Field;
import java.util.List;
import org.raml.model.Raml;
import org.raml.parser.loader.ResourceLoader;
import org.raml.parser.rule.DefaultTupleRule;
import org.raml.parser.rule.ImplicitMapEntryRule;
import org.raml.parser.rule.NodeRule;
import org.raml.parser.rule.NodeRuleFactory;
import org.raml.parser.rule.ValidationResult;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.ScalarNode;
public class RamlDocumentValidator extends YamlDocumentValidator
{
private TemplateResolver templateResolver;
private MediaTypeResolver mediaTypeResolver = new MediaTypeResolver();
private ResourceLoader resourceLoader;
public RamlDocumentValidator()
{
super(Raml.class);
}
public RamlDocumentValidator(NodeRuleFactory nodeRuleFactory)
{
super(Raml.class, nodeRuleFactory);
}
public TemplateResolver getTemplateResolver()
{
if (templateResolver == null)
{
templateResolver = new TemplateResolver(resourceLoader, this);
}
return templateResolver;
}
public MediaTypeResolver getMediaTypeResolver()
{
return mediaTypeResolver;
}
@Override
public void onMappingNodeStart(MappingNode mappingNode, TupleType tupleType)
{
super.onMappingNodeStart(mappingNode, tupleType);
if (tupleType == KEY)
{
return;
}
NodeRule<?> rule = getRuleContext().peek();
if (isResourceRule(rule))
{
List<ValidationResult> templateValidations = getTemplateResolver().resolve(
mappingNode, getResourceUri(rule), getFullUri(rule));
getMessages().addAll(templateValidations);
}
else if (isBodyRule(rule))
{
List<ValidationResult> mediaTypeValidations = getMediaTypeResolver().resolve(mappingNode);
getMessages().addAll(mediaTypeValidations);
}
}
private String getResourceUri(NodeRule<?> resourceRule)
{
Node keyNode = ((DefaultTupleRule) resourceRule).getKey();
return ((ScalarNode) keyNode).getValue();
}
private String getFullUri(NodeRule<?> resourceRule)
{
String fullUri = "";
while (resourceRule instanceof ImplicitMapEntryRule)
{
Node keyNode = ((DefaultTupleRule) resourceRule).getKey();
fullUri = ((ScalarNode) keyNode).getValue() + fullUri;
resourceRule = ((DefaultTupleRule) resourceRule).getParentTupleRule();
}
return fullUri;
}
private boolean isBodyRule(NodeRule<?> rule)
{
try
{
Field valueType = rule.getClass().getDeclaredField("valueType");
valueType.setAccessible(true);
return ((Class) valueType.get(rule)).getName().equals("org.raml.model.MimeType");
}
catch (NoSuchFieldException e)
{
return false;
}
catch (IllegalAccessException e)
{
return false;
}
}
private boolean isResourceRule(NodeRule<?> rule)
{
try
{
Field valueType = rule.getClass().getDeclaredField("valueType");
valueType.setAccessible(true);
return ((Class) valueType.get(rule)).getName().equals("org.raml.model.Resource");
}
catch (NoSuchFieldException e)
{
return false;
}
catch (IllegalAccessException e)
{
return false;
}
}
public void setResourceLoader(ResourceLoader resourceLoader)
{
this.resourceLoader = resourceLoader;
}
}