org.killbill.billing.util.dao.EntityHistoryBinder Maven / Gradle / Ivy
/*
* Copyright 2010-2012 Ning, Inc.
*
* Ning licenses this file to you 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.killbill.billing.util.dao;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationTargetException;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.sqlobject.Binder;
import org.skife.jdbi.v2.sqlobject.BinderFactory;
import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.killbill.billing.util.entity.Entity;
import org.killbill.billing.util.entity.dao.EntityModelDao;
@BindingAnnotation(EntityHistoryBinder.EntityHistoryBinderFactory.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface EntityHistoryBinder {
public static class EntityHistoryBinderFactory, E extends Entity> implements BinderFactory {
private static final Logger logger = LoggerFactory.getLogger(EntityHistoryBinder.class);
@Override
public Binder build(final Annotation annotation) {
return new Binder>() {
@Override
public void bind(final SQLStatement> q, final EntityHistoryBinder bind, final EntityHistoryModelDao history) {
try {
// Emulate @SmartBindBean
final M arg = history.getEntity();
final BeanInfo infos = Introspector.getBeanInfo(arg.getClass());
final PropertyDescriptor[] props = infos.getPropertyDescriptors();
for (final PropertyDescriptor prop : props) {
q.bind(prop.getName(), prop.getReadMethod().invoke(arg));
}
q.bind("id", history.getId());
q.bind("targetRecordId", history.getTargetRecordId());
q.bind("changeType", history.getChangeType().toString());
} catch (IntrospectionException e) {
logger.warn(e.getMessage());
} catch (InvocationTargetException e) {
logger.warn(e.getMessage());
} catch (IllegalAccessException e) {
logger.warn(e.getMessage());
}
}
};
}
}
}