public List<ValidationResult> resolve(MappingNode resourceNode, String relativeUri, String fullUri) { List<ValidationResult> templateValidations = new ArrayList<ValidationResult>(); //avoid processing resources already processed (yaml references) if (resolvedNodes.contains(resourceNode)) { return templateValidations; } resolvedNodes.add(resourceNode); return new ResourceTemplateMerger(templateValidations, resourceNode, relativeUri, fullUri).merge(); }
private MappingNode cloneTemplate(Node reference, TemplateType type) String templateName = getTemplateName(reference); if (templateName.isEmpty()) defaultParameters.put("resourcePathName", getResourcePathName(fullUri)); if (templateNode == null) addError(label + " not defined: " + templateName, reference); return null; return cloneMappingNode(templateNode, getTemplateParameters(reference, defaultParameters));
private boolean mergeTemplatesIfNeeded(MappingNode resourceNode, Map<String, Node> globalActionNodes) TemplateReferences references = extractTemplateReferences(resourceNode, globalActionNodes); Node typeReference = references.typeReference; Map<String, SequenceNode> traitsReference = references.traitsReference; if (!actionName.equals(ALL_ACTIONS)) applyTraitsToActions(actionEntry.getValue(), actionNodes, actionName); applyTraitsToActions(traitsReference.get(ALL_ACTIONS), actionNodes, null); MappingNode clone = cloneTemplate(typeReference, TemplateType.RESOURCE_TYPE); if (clone == null) mergeTemplatesIfNeeded(clone, actionNodes); applyTraitsToActions(traitsReference.get(ALL_ACTIONS), actionNodes, null); mergeNodes(resourceNode, clone, new MergeContext(Resource.class, clone.getTag()));
if (key.equals(RESOURCE_TYPE_USE_KEY)) templateReferences.typeReference = cloneNode(resourceTuple.getValueNode(), new HashMap<String, String>()); removeParametersFromTemplateCall(resourceTuple); else if (key.equals(TRAIT_USE_KEY) && expect(resourceTuple.getValueNode(), sequence)) SequenceNode sequence = cloneSequenceNode((SequenceNode) resourceTuple.getValueNode(), new HashMap<String, String>()); templateReferences.traitsReference.put(ALL_ACTIONS, sequence); removeParametersFromTraitsCall(resourceTuple); if (actionNode.getTag().equals(Tag.NULL)) actionNode = setTupleValueToEmptyMappingNode(resourceTuple); if (actionTupleKey.equals(TRAIT_USE_KEY) && expect(actionTuple.getValueNode(), sequence)) SequenceNode sequence = cloneSequenceNode((SequenceNode) actionTuple.getValueNode(), new HashMap<String, String>()); templateReferences.traitsReference.put(normalizeKey(key), sequence); removeParametersFromTraitsCall(actionTuple);
if (key.equals(RESOURCE_TYPE_USE_KEY)) templateReferences.typeReference = cloneNode(resourceTuple.getValueNode(), new HashMap<String, String>()); removeParametersFromTemplateCall(resourceTuple); else if (key.equals(TRAIT_USE_KEY) && expect(resourceTuple.getValueNode(), sequence)) SequenceNode sequence = cloneSequenceNode((SequenceNode) resourceTuple.getValueNode(), new HashMap<String, String>()); templateReferences.traitsReference.put(ALL_ACTIONS, sequence); removeParametersFromTraitsCall(resourceTuple); if (actionNode.getTag().equals(Tag.NULL)) actionNode = setTupleValueToEmptyMappingNode(resourceTuple); if (actionTupleKey.equals(TRAIT_USE_KEY) && expect(actionTuple.getValueNode(), sequence)) SequenceNode sequence = cloneSequenceNode((SequenceNode) actionTuple.getValueNode(), new HashMap<String, String>()); templateReferences.traitsReference.put(normalizeKey(key), sequence); removeParametersFromTraitsCall(actionTuple);
private boolean mergeTemplatesIfNeeded(MappingNode resourceNode, Map<String, Node> globalActionNodes) TemplateReferences references = extractTemplateReferences(resourceNode, globalActionNodes); Node typeReference = references.typeReference; Map<String, SequenceNode> traitsReference = references.traitsReference; if (!actionName.equals(ALL_ACTIONS)) applyTraitsToActions(actionEntry.getValue(), actionNodes, actionName); applyTraitsToActions(traitsReference.get(ALL_ACTIONS), actionNodes, null); MappingNode clone = cloneTemplate(typeReference, TemplateType.RESOURCE_TYPE); if (clone == null) mergeTemplatesIfNeeded(clone, actionNodes); applyTraitsToActions(traitsReference.get(ALL_ACTIONS), actionNodes, null); mergeNodes(resourceNode, clone, new MergeContext(Resource.class, clone.getTag()));
addError("Mapping node expected", params); return parameters; addError("Scalar node expected", paramTuple.getKeyNode()); break; addError("Scalar node expected", paramTuple.getValueNode()); break; parameters.put(paramKey, resolveParameterValueInclude(valueNode));
addError("Mapping node expected", params); return parameters; addError("Scalar node expected", paramTuple.getKeyNode()); break; addError("Scalar node expected", paramTuple.getValueNode()); break; parameters.put(paramKey, resolveParameterValueInclude(valueNode));
private String resolveParameter(String match, Map<String, String> parameters, ScalarNode node) { String result = ""; String[] tokens = match.substring(2, match.length() - 2).split("\\|"); for (String token : tokens) { token = token.trim(); if (parameters.containsKey(token)) { result = parameters.get(token); } else if (token.startsWith("!")) { try { Method method = Inflector.class.getMethod(token.substring(1), String.class); result = (String) method.invoke(null, result); } catch (Exception e) { addError("Invalid parameter function: " + token, node); } } else { addError("Invalid parameter definition: " + match, node); } } return result; }
private String resolveParameter(String match, Map<String, String> parameters, ScalarNode node) { String result = ""; String[] tokens = match.substring(2, match.length() - 2).split("\\|"); for (String token : tokens) { token = token.trim(); if (parameters.containsKey(token)) { result = parameters.get(token); } else if (token.startsWith("!")) { try { Method method = Inflector.class.getMethod(token.substring(1), String.class); result = (String) method.invoke(null, result); } catch (Exception e) { addError("Invalid parameter function: " + token, node); } } else { addError("Invalid parameter definition: " + match, node); } } return result; }
private MappingNode cloneTemplate(Node reference, TemplateType type) String templateName = getTemplateName(reference); if (templateName.isEmpty()) defaultParameters.put("resourcePathName", getResourcePathName(fullUri)); if (templateNode == null) addError(label + " not defined: " + templateName, reference); return null; return cloneMappingNode(templateNode, getTemplateParameters(reference, defaultParameters));
private void applyTraitsToActions(SequenceNode traits, Map<String, Node> actionNodes, String actionName) { for (Node ref : traits.getValue()) { if (actionName == null) { for (Map.Entry<String, Node> actionEntry : actionNodes.entrySet()) { currentAction = actionEntry.getKey(); MappingNode templateNode = cloneTemplate(ref, TemplateType.TRAIT); if (templateNode != null) { mergeNodes(actionEntry.getValue(), templateNode, new MergeContext(Action.class, templateNode.getTag())); } } } else { currentAction = actionName; MappingNode templateNode = cloneTemplate(ref, TemplateType.TRAIT); if (templateNode != null) { mergeNodes(actionNodes.get(actionName), templateNode, new MergeContext(Action.class, templateNode.getTag())); } } } }
private void applyTraitsToActions(SequenceNode traits, Map<String, Node> actionNodes, String actionName) { for (Node ref : traits.getValue()) { if (actionName == null) { for (Map.Entry<String, Node> actionEntry : actionNodes.entrySet()) { currentAction = actionEntry.getKey(); MappingNode templateNode = cloneTemplate(ref, TemplateType.TRAIT); if (templateNode != null) { mergeNodes(actionEntry.getValue(), templateNode, new MergeContext(Action.class, templateNode.getTag())); } } } else { currentAction = actionName; MappingNode templateNode = cloneTemplate(ref, TemplateType.TRAIT); if (templateNode != null) { mergeNodes(actionNodes.get(actionName), templateNode, new MergeContext(Action.class, templateNode.getTag())); } } } }
private Node cloneNode(Node valueNode, Map<String, String> parameters) { if (valueNode.getNodeId() == mapping) { return cloneMappingNode((MappingNode) valueNode, parameters); } else if (valueNode.getNodeId() == sequence) { return cloneSequenceNode((SequenceNode) valueNode, parameters); } else if (valueNode.getNodeId() == scalar) { return cloneScalarNode((ScalarNode) valueNode, parameters); } addError("unsupported node type: " + valueNode.getNodeId(), valueNode); return null; }
private MappingNode cloneMappingNode(MappingNode node, Map<String, String> parameters) { List<NodeTuple> tuples = new ArrayList<NodeTuple>(); for (NodeTuple tuple : node.getValue()) { if (tuple.getKeyNode().getNodeId() != scalar) { addError(NON_SCALAR_KEY_MESSAGE, tuple.getKeyNode()); break; } Node key = cloneScalarNode((ScalarNode) tuple.getKeyNode(), parameters); Node value = cloneNode(tuple.getValueNode(), parameters); tuples.add(new NodeTuple(key, value)); } return new MappingNode(node.getTag(), tuples, node.getFlowStyle()); }
private Node cloneNode(Node valueNode, Map<String, String> parameters) { if (valueNode.getNodeId() == mapping) { return cloneMappingNode((MappingNode) valueNode, parameters); } else if (valueNode.getNodeId() == sequence) { return cloneSequenceNode((SequenceNode) valueNode, parameters); } else if (valueNode.getNodeId() == scalar) { return cloneScalarNode((ScalarNode) valueNode, parameters); } addError("unsupported node type: " + valueNode.getNodeId(), valueNode); return null; }
private String resolveParameterValueInclude(ScalarNode valueNode) { if (valueNode.getTag().equals(INCLUDE_TAG)) { Node resolved = includeResolver.resolve(valueNode, resourceLoader, nodeNandler); if (resolved.getNodeId() != scalar) { addError("Resource type and traits parameters must be scalars", valueNode); return ""; } valueNode = (ScalarNode) resolved; } return valueNode.getValue(); }
private MappingNode cloneMappingNode(MappingNode node, Map<String, String> parameters) { List<NodeTuple> tuples = new ArrayList<NodeTuple>(); for (NodeTuple tuple : node.getValue()) { if (tuple.getKeyNode().getNodeId() != scalar) { addError(NON_SCALAR_KEY_MESSAGE, tuple.getKeyNode()); break; } Node key = cloneScalarNode((ScalarNode) tuple.getKeyNode(), parameters); Node value = cloneNode(tuple.getValueNode(), parameters); tuples.add(new NodeTuple(key, value)); } return new MappingNode(node.getTag(), tuples, node.getFlowStyle()); }
private String resolveParameterValueInclude(ScalarNode valueNode) { if (valueNode.getTag().equals(INCLUDE_TAG)) { Node resolved = includeResolver.resolve(valueNode, resourceLoader, nodeNandler); if (resolved.getNodeId() != scalar) { addError("Resource type and traits parameters must be scalars", valueNode); return ""; } valueNode = (ScalarNode) resolved; } return valueNode.getValue(); }
private boolean expect(Node node, NodeId nodeId) { if (node.getNodeId() != nodeId) { addError(nodeId + " node expected", node); return false; } return true; }