Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2002-2014 the original author or authors.
*
* 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 com.nitorcreations.willow.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.parser.ParserException;
/**
* Base class for Yaml factories.
*
* @author Dave Syer
* @since 4.1
*/
public class YamlProcessor {
private final Logger logger = Logger.getLogger(getClass().getCanonicalName());
private ResolutionMethod resolutionMethod = ResolutionMethod.OVERRIDE;
private InputStream[] resources = new InputStream[0];
private List documentMatchers = Collections.emptyList();
private boolean matchDefault = true;
/**
* A map of document matchers allowing callers to selectively use only
* some of the documents in a YAML URI. In YAML documents are
* separated by --- lines, and each document is converted
* to properties before the match is made. E.g.
*
*
* @param matchers a map of keys to value patterns (regular expressions)
*/
public void setDocumentMatchers(DocumentMatcher... matchers) {
this.documentMatchers = Arrays.asList(matchers);
}
/**
* Flag indicating that a document for which all the
* {@link #setDocumentMatchers(DocumentMatcher...) document matchers} abstain will
* nevertheless match.
* @param matchDefault the flag to set (default true)
*/
public void setMatchDefault(boolean matchDefault) {
this.matchDefault = matchDefault;
}
/**
* Method to use for resolving URIs. Each URI will be converted to a Map, so
* this property is used to decide which map entries to keep in the final output from
* this factory.
* @param resolutionMethod the resolution method to set (defaults to
* {@link ResolutionMethod#OVERRIDE}).
*/
public void setResolutionMethod(ResolutionMethod resolutionMethod) {
this.resolutionMethod = resolutionMethod;
}
/**
* Set locations of YAML {@link String URIs} to be loaded.
* @see ResolutionMethod
*/
public void setResources(InputStream... resources) {
this.resources = resources;
}
/**
* Provide an opportunity for subclasses to process the Yaml parsed from the supplied
* URIs. Each URI is parsed in turn and the documents inside checked against
* the {@link #setDocumentMatchers(DocumentMatcher...) matchers}. If a document
* matches it is passed into the callback, along with its representation as
* Properties. Depending on the {@link #setResolutionMethod(ResolutionMethod)} not all
* of the documents will be parsed.
* @param callback a callback to delegate to once matching documents are found
* @see #createYaml()
*/
protected void process(MatchCallback callback) {
Yaml yaml = createYaml();
for (InputStream next : this.resources) {
boolean found = process(callback, yaml, next);
if (this.resolutionMethod == ResolutionMethod.FIRST_FOUND && found) {
return;
}
}
}
/**
* Create the {@link Yaml} instance to use.
*/
protected Yaml createYaml() {
return new Yaml(new StrictMapAppenderConstructor());
}
private boolean process(MatchCallback callback, Yaml yaml, InputStream resource) {
int count = 0;
try {
if (this.logger.isLoggable(Level.FINE)) {
this.logger.fine("Loading from YAML: " + resource);
}
try (InputStream stream = resource) {
for (Object object : yaml.loadAll(stream)) {
if (object != null && process(asMap(object), callback)) {
count++;
if (this.resolutionMethod == ResolutionMethod.FIRST_FOUND) {
break;
}
}
}
if (this.logger.isLoggable(Level.FINE)) {
this.logger.fine("Loaded " + count + " document" + (count > 1 ? "s" : "") +
" from YAML URI: " + resource);
}
}
} catch (IOException ex) {
handleProcessError(resource, ex);
}
return count > 0;
}
private void handleProcessError(InputStream resource, IOException ex) {
if (this.resolutionMethod != ResolutionMethod.FIRST_FOUND &&
this.resolutionMethod != ResolutionMethod.OVERRIDE_AND_IGNORE) {
throw new IllegalStateException(ex);
}
this.logger.warning("Could not load map from " + resource + ": " + ex.getMessage());
}
@SuppressWarnings("unchecked")
private Map asMap(Object object) {
// YAML can have numbers as keys
Map result = new LinkedHashMap();
if (!(object instanceof Map)) {
// A document can be a text literal
result.put("document", object);
return result;
}
Map