com.vectorprint.configuration.binding.parameters.ParamBindingService Maven / Gradle / Ivy
/*
* Copyright 2015 VectorPrint.
*
* 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.vectorprint.configuration.binding.parameters;
/*
* #%L
* Config
* %%
* Copyright (C) 2015 VectorPrint
* %%
* 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.
* #L%
*/
import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Singleton provider of {@link ParameterizableBindingFactory} instances. This class uses spi ({@link ServiceLoader#load(java.lang.Class)
* }) to find instances of {@link ParameterizableBindingFactory} and of {@link ParamFactoryValidator}. Every factory found is validated by all validators found,
* the first valid factory is returned.
*
* @author Eduard Drenth at VectorPrint.nl
*/
public class ParamBindingService {
private static final Logger LOGGER = Logger.getLogger(ParamBindingService.class.getName());
private final ServiceLoader factories;
private final ServiceLoader validators;
private ParamBindingService() {
factories = ServiceLoader.load(ParameterizableBindingFactory.class);
validators = ServiceLoader.load(ParamFactoryValidator.class);
}
private static final ParamBindingService instance = new ParamBindingService();
public static ParamBindingService getInstance() {
return instance;
}
/**
* Return the first implementation of {@link ParameterizableBindingFactory} found that is valid according to all
* {@link ParamFactoryValidator}s, or return null. When no validator is published return the first {@link ParameterizableBindingFactory} found.
*
* @return
*/
public ParameterizableBindingFactory getFactory() {
for (ParameterizableBindingFactory f : factories) {
if (isValid(f)) {
return f;
}
}
return null;
}
/**
*
* @return a list of factories found through SPI
*/
public List> getFactoriesKnown() {
List> l = new ArrayList<>();
for (ParameterizableBindingFactory f : factories) {
l.add(f.getClass());
}
return l;
}
public boolean isValid(ParameterizableBindingFactory f ) {
boolean ok = true;
boolean noValidatorFound = true;
for (ParamFactoryValidator validator : validators) {
noValidatorFound = false;
if (!validator.isValid(f)) {
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(String.format("%s does not pass validation by %s", f.getClass().getName(), validator.getClass().getName()));
}
ok = false;
break;
}
}
return ok||noValidatorFound;
}
/**
*
* @return a list of valid factories found through SPI
*/
public List> getValidFactories() {
List> l = new ArrayList<>();
for (ParameterizableBindingFactory f : factories) {
if (isValid(f)) {
l.add(f.getClass());
}
}
return l;
}
/**
*
* @return a list of validators found through SPI
*/
public List> getValidatorsKnown() {
List> l = new ArrayList<>();
for (ParamFactoryValidator f : validators) {
l.add(f.getClass());
}
return l;
}
}