001
014
015 package com.liferay.portal.spring.bean;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019
020 import java.lang.reflect.Field;
021
022 import java.util.ArrayList;
023 import java.util.IdentityHashMap;
024 import java.util.List;
025 import java.util.Map;
026
027 import org.springframework.beans.factory.BeanFactory;
028
029
032 public class BeanReferenceRefreshUtil {
033
034 public static void refresh(BeanFactory beanFactory) throws Exception {
035 for (Map.Entry<Object, List<RefreshPoint>> entry :
036 _registeredRefreshPoints.entrySet()) {
037
038 _refresh(beanFactory, entry.getKey(), entry.getValue());
039 }
040
041 _registeredRefreshPoints.clear();
042 }
043
044 public static void registerRefreshPoint(
045 Object targetBean, Field field, String referencedBeanName) {
046
047 List<RefreshPoint> refreshPoints = _registeredRefreshPoints.get(
048 targetBean);
049
050 if (refreshPoints == null) {
051 refreshPoints = new ArrayList<RefreshPoint>();
052
053 _registeredRefreshPoints.put(targetBean, refreshPoints);
054 }
055
056 refreshPoints.add(new RefreshPoint(field, referencedBeanName));
057 }
058
059 private static void _refresh(
060 BeanFactory beanFactory, Object targetBean,
061 List<RefreshPoint> refreshPoints)
062 throws Exception {
063
064 for (RefreshPoint refreshPoint : refreshPoints) {
065 _refresh(beanFactory, targetBean, refreshPoint);
066 }
067 }
068
069 private static void _refresh(
070 BeanFactory beanFactory, Object targetBean,
071 RefreshPoint refreshPoint)
072 throws Exception {
073
074 Field field = refreshPoint._field;
075
076 Object oldReferenceBean = field.get(targetBean);
077
078 String referencedBeanName = refreshPoint._referencedBeanName;
079
080 Object newReferencedBean = beanFactory.getBean(referencedBeanName);
081
082 if (oldReferenceBean == newReferencedBean) {
083 return;
084 }
085
086 field.set(targetBean, newReferencedBean);
087
088 if (_log.isDebugEnabled()) {
089 _log.debug(
090 "Refreshed field " + field + " with old value " +
091 oldReferenceBean + " with new value " + newReferencedBean +
092 " on bean " + targetBean);
093 }
094 }
095
096 private static Log _log = LogFactoryUtil.getLog(
097 BeanReferenceRefreshUtil.class);
098
099 private static Map<Object, List<RefreshPoint>> _registeredRefreshPoints =
100 new IdentityHashMap<Object, List<RefreshPoint>>();
101
102 private static class RefreshPoint {
103
104 public RefreshPoint(Field field, String referencedBeanName) {
105 _field = field;
106 _referencedBeanName = referencedBeanName;
107 }
108
109 private Field _field;
110 private String _referencedBeanName;
111
112 }
113
114 }