package org.minnal.jaxrs.test; import java.beans.PropertyDescriptor; import java.util.Collection; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; import org.minnal.autopojo.AttributeMetaData; import org.minnal.autopojo.resolver.CollectionResolver; 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 BiDirectionalCollectionResolver extends CollectionResolver { private static final Logger logger = LoggerFactory.getLogger(BiDirectionalCollectionResolver.class); @Override public void resolve(Object pojo, AttributeMetaData attribute, int maxDepth) { // Prevent looping incase of composite models if (maxDepth > 2 && attribute.getTypeArguments()[0].equals(pojo.getClass())) { return; } super.resolve(pojo, attribute, maxDepth); } @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) { Class<?> elementType = (Class<?>) attribute.getTypeArguments()[0]; PropertyDescriptor backReference = getManagedBackReference(elementType, managedReference.value()); if (backReference != null) { Collection collection = (Collection) value; for (Object object : collection) { try { PropertyUtils.setProperty(object, 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; } }