private void retrieveBeanField()

in src/main/java/org/apache/jackrabbit/ocm/manager/objectconverter/impl/ObjectConverterImpl.java [651:712]


	private void retrieveBeanField(Session session,BeanDescriptor beanDescriptor, Node node, Object object, boolean forceToRetrieve )
	{
		if (!beanDescriptor.isAutoRetrieve() && !forceToRetrieve)
		{
			return;
		}


		String beanName = beanDescriptor.getFieldName();
		String beanPath = ObjectContentManagerUtil.getPath(session, beanDescriptor, node);

		Object bean = null;
		if (requestObjectCache.isCached(beanPath))
	    {
	        bean = requestObjectCache.getObject(beanPath);
	    	ReflectionUtils.setNestedProperty(object, beanName, bean);
	    }
		else
		{
			Class beanClass = ReflectionUtils.getPropertyType(object, beanName);

			String converterClassName = null;
			if (null == beanDescriptor.getConverter() || "".equals(beanDescriptor.getConverter()))
			{
				converterClassName = DEFAULT_BEAN_CONVERTER;
			}
			else
			{
				converterClassName = beanDescriptor.getConverter();
			}

			Object[] param = {this.mapper, this, this.atomicTypeConverterProvider};
			BeanConverter beanConverter = (BeanConverter) ReflectionUtils.invokeConstructor(converterClassName, param);
			if (beanDescriptor.isProxy())
			{
				if (beanDescriptor.getJcrType() != null && !"".equals(beanDescriptor.getJcrType())) {
					// If a mapped jcrType has been set, use it as proxy parent class instead of the bean property type.
					// This way, we can handle proxies when bean property type is an interface.
					try {
						String className = mapper.getClassDescriptorByNodeType(beanDescriptor.getJcrType()).getClassName();
						if (log.isDebugEnabled()) {
							log.debug("a mapped jcrType has been specified, switching from <" + beanClass + "> to <" + ReflectionUtils.forName(className));
						}
						beanClass = ReflectionUtils.forName(className);
					
					} catch (IncorrectPersistentClassException e) {
						if (log.isDebugEnabled()) {
							log.debug(beanDescriptor.getClassDescriptor().getJcrType() + " is not mapped");
						}
					}					
				}

				bean = proxyManager.createBeanProxy(beanConverter, beanConverter.getPath(session, beanDescriptor, node), session, node, beanDescriptor,  mapper.getClassDescriptorByClass(beanClass), beanClass, bean);
			}
			else
			{
				bean = beanConverter.getObject(session, node, beanDescriptor,  mapper.getClassDescriptorByClass(beanClass), beanClass, bean);
			}
			requestObjectCache.cache(beanPath, bean);
			ReflectionUtils.setNestedProperty(object, beanName, bean);
		}
	}