/*
* 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.jdbi.v3.sqlobject;
import java.lang.reflect.Method;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.jdbi.v3.core.config.JdbiConfig;
Registry for handler decorators
. Decorators may modify or augment the behavior of a method Handler in some way. Out of the box, a decorator is registered which applies decorations for any decorating annotations
present on a SQL method. For example, using the Transaction
annotation will cause a SQL method to be executed within a transaction. Decorators are applied in the order registered, from innermost to outermost: the last registered decorator will be the outermost decorator around the method handler. /**
* Registry for {@link HandlerDecorator handler decorators}. Decorators may modify or augment the behavior of a method
* Handler in some way. Out of the box, a decorator is registered which applies decorations for any
* {@link SqlMethodDecoratingAnnotation decorating annotations} present on a SQL method. For example, using the
* {@link org.jdbi.v3.sqlobject.transaction.Transaction} annotation will cause a SQL method to be executed within a
* transaction. Decorators are applied in the order registered, from innermost to outermost: the last registered
* decorator will be the outermost decorator around the method handler.
*/
public class HandlerDecorators implements JdbiConfig<HandlerDecorators> {
private final List<HandlerDecorator> decorators = new CopyOnWriteArrayList<>();
public HandlerDecorators() {
register(new SqlMethodAnnotatedHandlerDecorator());
}
private HandlerDecorators(HandlerDecorators that) {
decorators.addAll(that.decorators);
}
Registers the given handler decorator with the registry.
Params: - decorator – the decorator to register
Returns: this
/**
* Registers the given handler decorator with the registry.
*
* @param decorator the decorator to register
* @return this
*/
public HandlerDecorators register(HandlerDecorator decorator) {
decorators.add(decorator);
return this;
}
Applies all registered decorators to the given handler
Params: - base – the base handler
- sqlObjectType – the SQL object type
- method – the SQL method to be decorated
Returns: the decorated handler
/**
* Applies all registered decorators to the given handler
*
* @param base the base handler
* @param sqlObjectType the SQL object type
* @param method the SQL method to be decorated
* @return the decorated handler
*/
public Handler applyDecorators(Handler base, Class<?> sqlObjectType, Method method) {
Handler handler = base;
for (HandlerDecorator decorator : decorators) {
handler = decorator.decorateHandler(handler, sqlObjectType, method);
}
return handler;
}
@Override
public HandlerDecorators createCopy() {
return new HandlerDecorators(this);
}
}