package org.minnal.jaxrs.test; import java.beans.PropertyDescriptor; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; import org.minnal.autopojo.AttributeMetaData; import org.minnal.autopojo.resolver.ObjectResolver; import org.minnal.autopojo.util.PropertyUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonManagedReference; /** * @author ganeshs * */ public class BiDirectionalObjectResolver extends ObjectResolver { private static final Logger logger = LoggerFactory.getLogger(BiDirectionalObjectResolver.class); @Override protected void setAttribute(Object pojo, AttributeMetaData attribute, Object value) { super.setAttribute(pojo, attribute, value); JsonManagedReference managedReference = attribute.getAnnotation(JsonManagedReference.class); if (managedReference != null && value != null) { PropertyDescriptor backReference = getManagedBackReference(value.getClass(), managedReference.value()); if (backReference != null) { try { PropertyUtils.setProperty(value, backReference.getName(), pojo); } catch (Exception e) { logger.info("Failed while setting the property {} on the class {}", backReference.getName(), value.getClass()); } } } } private PropertyDescriptor getManagedBackReference(Class<?> clazz, String name) { List<PropertyDescriptor> descriptors = PropertyUtil.getPopertiesWithAnnotation(clazz, JsonBackReference.class); if (descriptors != null) { for (PropertyDescriptor descriptor : descriptors) { JsonBackReference backReference = PropertyUtil.getAnnotation(descriptor, JsonBackReference.class); if (backReference.value().equals(name)) { return descriptor; } } } return null; } }