/* * Copyright (c) 2014 Intellectual Reserve, Inc. All rights reserved. * * 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 cf.spring.servicebroker; import static cf.spring.servicebroker.AccessorUtils.*; import org.springframework.beans.factory.BeanCreationException; import java.lang.reflect.Method; /** * Hold information about a service broker. * * @author Mike Heath */ class ServiceBrokerMethods { private final String beanName; private final Method provision; private final Method update; private final Method deprovision; private final Method bind; private final Method unbind; ServiceBrokerMethods(String beanName, boolean bindable, Method provision, Method update, Method deprovision, Method bind, Method unbind) { this.beanName = beanName; this.provision = provision; this.update = update; this.deprovision = deprovision; this.bind = bind; this.unbind = unbind; validateProvisionMethod(provision); validateUpdateMethod(update); validateDeprovisionMethod(deprovision); validateBindMethod(bind, bindable); validateUnbindMethod(unbind, bindable); } public String getBeanName() { return beanName; } public Method getProvision() { return provision; } public Method getUpdate() { return update; } public Method getDeprovision() { return deprovision; } public Method getBind() { return bind; } public Method getUnbind() { return unbind; } private void validateProvisionMethod(Method provisionMethod) { if (provisionMethod == null) { throw new BeanCreationException("A bean with @" + ServiceBroker.class.getName() + " must have method with @" + Provision.class.getName()); } validateReturnType(provisionMethod, Provision.class, ProvisionResponse.class); validateArgument(provisionMethod, Provision.class, ProvisionRequest.class); } private void validateUpdateMethod(Method updateMethod) { if (updateMethod == null) { return; } validateReturnType(updateMethod, Update.class, void.class); validateArgument(updateMethod, Update.class, UpdateRequest.class); } private void validateDeprovisionMethod(Method deprovisionMethod) { if (deprovisionMethod == null) { return; } validateReturnType(deprovisionMethod, Deprovision.class, void.class); validateArgument(deprovisionMethod, Deprovision.class, DeprovisionRequest.class); } private void validateBindMethod(Method bindMethod, boolean bindable) { if (bindable && bindMethod == null) { throw new BeanCreationException("Bindable service brokers must have a method with @" + Bind.class.getName()); } if (!bindable && bindMethod != null) { throw new BeanCreationException("Service broker on class " + bindMethod.getDeclaringClass().getName() + " is NOT bindable but has a method annotated with @" + Bind.class.getName()); } if (bindMethod == null) { return; } validateReturnType(bindMethod, Bind.class, BindResponse.class); validateArgument(bindMethod, Bind.class, BindRequest.class); } private void validateUnbindMethod(Method unbindMethod, boolean bindable) { if (unbindMethod == null) { return; } if (!bindable) { throw new BeanCreationException("Service broker on class " + unbindMethod.getDeclaringClass().getName() + " is NOT bindable but has a method annotated with @" + Unbind.class.getName()); } validateReturnType(unbindMethod, Unbind.class, void.class); validateArgument(unbindMethod, Bind.class, UnbindRequest.class); } }