/*
* Copyright 2011 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.jayway.jsonpath;
import com.jayway.jsonpath.internal.
DefaultsImpl;
import com.jayway.jsonpath.spi.json.
JsonProvider;
import com.jayway.jsonpath.spi.mapper.
MappingProvider;
import java.util.
ArrayList;
import java.util.
Arrays;
import java.util.
Collection;
import java.util.
Collections;
import java.util.
EnumSet;
import java.util.
Set;
import static com.jayway.jsonpath.internal.
Utils.notNull;
import static java.util.
Arrays.asList;
/**
* Immutable configuration object
*/
public class
Configuration {
private static
Defaults DEFAULTS = null;
/**
* Set Default configuration
* @param defaults default configuration settings
*/
public static synchronized void
setDefaults(
Defaults defaults){
DEFAULTS =
defaults;
}
private static
Defaults getEffectiveDefaults(){
if (
DEFAULTS == null) {
return
DefaultsImpl.
INSTANCE;
} else {
return
DEFAULTS;
}
}
private final
JsonProvider jsonProvider;
private final
MappingProvider mappingProvider;
private final
Set<
Option>
options;
private final
Collection<
EvaluationListener>
evaluationListeners;
private
Configuration(
JsonProvider jsonProvider,
MappingProvider mappingProvider,
EnumSet<
Option>
options,
Collection<
EvaluationListener>
evaluationListeners) {
notNull(
jsonProvider, "jsonProvider can not be null");
notNull(
mappingProvider, "mappingProvider can not be null");
notNull(
options, "setOptions can not be null");
notNull(
evaluationListeners, "evaluationListeners can not be null");
this.
jsonProvider =
jsonProvider;
this.
mappingProvider =
mappingProvider;
this.
options =
Collections.
unmodifiableSet(
options);
this.
evaluationListeners =
Collections.
unmodifiableCollection(
evaluationListeners);
}
/**
* Creates a new Configuration by the provided evaluation listeners to the current listeners
* @param evaluationListener listeners
* @return a new configuration
*/
public
Configuration addEvaluationListeners(
EvaluationListener...
evaluationListener){
return
Configuration.
builder().
jsonProvider(
jsonProvider).
mappingProvider(
mappingProvider).
options(
options).
evaluationListener(
evaluationListener).
build();
}
/**
* Creates a new Configuration with the provided evaluation listeners
* @param evaluationListener listeners
* @return a new configuration
*/
public
Configuration setEvaluationListeners(
EvaluationListener...
evaluationListener){
return
Configuration.
builder().
jsonProvider(
jsonProvider).
mappingProvider(
mappingProvider).
options(
options).
evaluationListener(
evaluationListener).
build();
}
/**
* Returns the evaluation listeners registered in this configuration
* @return the evaluation listeners
*/
public
Collection<
EvaluationListener>
getEvaluationListeners(){
return
evaluationListeners;
}
/**
* Creates a new Configuration based on the given {@link com.jayway.jsonpath.spi.json.JsonProvider}
* @param newJsonProvider json provider to use in new configuration
* @return a new configuration
*/
public
Configuration jsonProvider(
JsonProvider newJsonProvider) {
return
Configuration.
builder().
jsonProvider(
newJsonProvider).
mappingProvider(
mappingProvider).
options(
options).
evaluationListener(
evaluationListeners).
build();
}
/**
* Returns {@link com.jayway.jsonpath.spi.json.JsonProvider} used by this configuration
* @return jsonProvider used
*/
public
JsonProvider jsonProvider() {
return
jsonProvider;
}
/**
* Creates a new Configuration based on the given {@link com.jayway.jsonpath.spi.mapper.MappingProvider}
* @param newMappingProvider mapping provider to use in new configuration
* @return a new configuration
*/
public
Configuration mappingProvider(
MappingProvider newMappingProvider) {
return
Configuration.
builder().
jsonProvider(
jsonProvider).
mappingProvider(
newMappingProvider).
options(
options).
evaluationListener(
evaluationListeners).
build();
}
/**
* Returns {@link com.jayway.jsonpath.spi.mapper.MappingProvider} used by this configuration
* @return mappingProvider used
*/
public
MappingProvider mappingProvider() {
return
mappingProvider;
}
/**
* Creates a new configuration by adding the new options to the options used in this configuration.
* @param options options to add
* @return a new configuration
*/
public
Configuration addOptions(
Option...
options) {
EnumSet<
Option>
opts =
EnumSet.
noneOf(
Option.class);
opts.
addAll(this.
options);
opts.
addAll(
asList(
options));
return
Configuration.
builder().
jsonProvider(
jsonProvider).
mappingProvider(
mappingProvider).
options(
opts).
evaluationListener(
evaluationListeners).
build();
}
/**
* Creates a new configuration with the provided options. Options in this configuration are discarded.
* @param options
* @return
*/
public
Configuration setOptions(
Option...
options) {
return
Configuration.
builder().
jsonProvider(
jsonProvider).
mappingProvider(
mappingProvider).
options(
options).
evaluationListener(
evaluationListeners).
build();
}
/**
* Returns the options used by this configuration
* @return
*/
public
Set<
Option>
getOptions() {
return
options;
}
/**
* Check if this configuration contains the given option
* @param option option to check
* @return true if configurations contains option
*/
public boolean
containsOption(
Option option){
return
options.
contains(
option);
}
/**
* Creates a new configuration based on default values
* @return a new configuration based on defaults
*/
public static
Configuration defaultConfiguration() {
Defaults defaults =
getEffectiveDefaults();
return
Configuration.
builder().
jsonProvider(
defaults.
jsonProvider()).
options(
defaults.
options()).
build();
}
/**
* Returns a new ConfigurationBuilder
* @return a builder
*/
public static
ConfigurationBuilder builder() {
return new
ConfigurationBuilder();
}
/**
* Configuration builder
*/
public static class
ConfigurationBuilder {
private
JsonProvider jsonProvider;
private
MappingProvider mappingProvider;
private
EnumSet<
Option>
options =
EnumSet.
noneOf(
Option.class);
private
Collection<
EvaluationListener>
evaluationListener = new
ArrayList<
EvaluationListener>();
public
ConfigurationBuilder jsonProvider(
JsonProvider provider) {
this.
jsonProvider =
provider;
return this;
}
public
ConfigurationBuilder mappingProvider(
MappingProvider provider) {
this.
mappingProvider =
provider;
return this;
}
public
ConfigurationBuilder options(
Option...
flags) {
if(
flags.length > 0) {
this.
options.
addAll(
asList(
flags));
}
return this;
}
public
ConfigurationBuilder options(
Set<
Option>
options) {
this.
options.
addAll(
options);
return this;
}
public
ConfigurationBuilder evaluationListener(
EvaluationListener...
listener){
this.
evaluationListener =
Arrays.
asList(
listener);
return this;
}
public
ConfigurationBuilder evaluationListener(
Collection<
EvaluationListener>
listeners){
this.
evaluationListener =
listeners == null ?
Collections.<
EvaluationListener>
emptyList() :
listeners;
return this;
}
public
Configuration build() {
if (
jsonProvider == null ||
mappingProvider == null) {
final
Defaults defaults =
getEffectiveDefaults();
if (
jsonProvider == null) {
jsonProvider =
defaults.
jsonProvider();
}
if (
mappingProvider == null){
mappingProvider =
defaults.
mappingProvider();
}
}
return new
Configuration(
jsonProvider,
mappingProvider,
options,
evaluationListener);
}
}
public interface
Defaults {
/**
* Returns the default {@link com.jayway.jsonpath.spi.json.JsonProvider}
* @return default json provider
*/
JsonProvider jsonProvider();
/**
* Returns default setOptions
* @return setOptions
*/
Set<
Option>
options();
/**
* Returns the default {@link com.jayway.jsonpath.spi.mapper.MappingProvider}
*
* @return default mapping provider
*/
MappingProvider mappingProvider();
}
}