page but list
[cdmlib.git] / cdmlib-remote / src / main / java / eu / etaxonomy / cdm / remote / json / JsonConfigFactoryBean.java
index a167585d55c48d950248f6f440e397d4761b15bc..76ff54e69bdeab3fbe694b090ab11693e87794f3 100644 (file)
@@ -15,6 +15,7 @@ import java.util.HashMap;
 import java.util.List;\r
 import java.util.Map;\r
 \r
+import net.sf.json.JSONObject;\r
 import net.sf.json.JsonConfig;\r
 import net.sf.json.processors.JsonBeanProcessor;\r
 import net.sf.json.processors.JsonBeanProcessorMatcher;\r
@@ -23,23 +24,33 @@ import net.sf.json.processors.JsonValueProcessorMatcher;
 import net.sf.json.util.CycleDetectionStrategy;\r
 import net.sf.json.util.PropertyFilter;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.springframework.beans.factory.FactoryBean;\r
 \r
+import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
+import eu.etaxonomy.cdm.remote.json.processor.bean.AbstractCdmBeanProcessor;\r
+\r
 /**\r
  * \r
  * @author ben.clark\r
  * @author a.kohlbecker\r
  */\r
 public class JsonConfigFactoryBean implements FactoryBean {\r
+       \r
+       public static final Logger logger = Logger.getLogger(JsonConfigFactoryBean.class);\r
 \r
        private JsonConfig jsonConfig = null;\r
        \r
        private CycleDetectionStrategy cycleDetectionStrategy = CycleDetectionStrategy.LENIENT;\r
        \r
-       private boolean ignoreJPATransient = false;\r
+       /**\r
+        * Default is true, to avoid LayzyLoadingExceptions. See\r
+        * {@link #setIgnoreJPATransient(boolean)}\r
+        */\r
+       private boolean ignoreJPATransient = true;\r
        \r
        private Map<Class,JsonBeanProcessor> jsonBeanProcessors = new HashMap<Class,JsonBeanProcessor>();\r
-       private List<PropertyFilter> jsonPropertyFilters = new ArrayList<PropertyFilter>();\r
+       private PropertyFilter jsonPropertyFilter = null;\r
        private Map<Class,JsonValueProcessor> jsonValueProcessors = new HashMap<Class,JsonValueProcessor>();\r
        private JsonBeanProcessorMatcher jsonBeanProcessorMatcher = JsonBeanProcessorMatcher.DEFAULT;\r
        private JsonValueProcessorMatcher jsonValueProcessorMatcher = JsonValueProcessorMatcher.DEFAULT;\r
@@ -50,7 +61,43 @@ public class JsonConfigFactoryBean implements FactoryBean {
                this.cycleDetectionStrategy = cycleDetectionStrategy;\r
        }\r
        \r
+       /**\r
+        * Default is true, to avoid LayzyLoadingExceptions.\r
+        * <p>\r
+        * \r
+        * @deprecated Setting this property to false will cause\r
+        *             LazyLoadingExceptions and will thus completely break the JSON\r
+        *             serialization!! <br>\r
+        *             In the cdm model all getters returning cdm entity or product\r
+        *             of cdm entities which are not directly returning a\r
+        *             HibernateProxy are annotated as @Transient. In order to\r
+        *             serialize these properties you have to do two things:\r
+        *             <ol>\r
+        *             <li>Explicitly serialize the property by overriding\r
+        *             {@link AbstractCdmBeanProcessor#processBeanSecondStep(eu.etaxonomy.cdm.model.common.CdmBase, net.sf.json.JSONObject, JsonConfig)}\r
+        *             in the according {AbstractCdmBeanProcessor} implementation.\r
+        *             If there is no matching {AbstractCdmBeanProcessor}\r
+        *             implementation you would have to create one. for example:\r
+        *             <pre>\r
+               @Override\r
+               public JSONObject processBeanSecondStep(TaxonNameBase bean, JSONObject json, JsonConfig jsonConfig) {\r
+                 json.element("taggedName", getTaggedName(bean), jsonConfig);\r
+                 return json;\r
+               }\r
+        *             </pre>\r
+        *             </li> <li>Provide the service method which is used to\r
+        *             retrieve the object graph in question with an appropriate\r
+        *             initialization strategy.</li>\r
+        *             </ol>\r
+        * <strong>please see also http://dev.e-taxonomy.eu/trac/wiki/CdmEntityInitalization</strong>\r
+        * \r
+        * @param ignoreJPATransient\r
+        */\r
+       @Deprecated\r
        public void setIgnoreJPATransient(boolean ignoreJPATransient) {\r
+               if(!ignoreJPATransient){\r
+                       logger.error("ignoreJPATransient must not be set to false. Doing so will cause LazyLoadingExceptions and will thus completely break the JSON serialization.");\r
+               }\r
                this.ignoreJPATransient = ignoreJPATransient;\r
        }\r
 \r
@@ -58,8 +105,8 @@ public class JsonConfigFactoryBean implements FactoryBean {
                this.jsonBeanProcessors = jsonBeanProcessors;\r
        }\r
 \r
-       public void setJsonPropertyFilters(List<PropertyFilter> jsonPropertyFilters) {\r
-               this.jsonPropertyFilters = jsonPropertyFilters;\r
+       public void setJsonPropertyFilter(PropertyFilter jsonPropertyFilter) {\r
+               this.jsonPropertyFilter = jsonPropertyFilter;\r
        }\r
 \r
        public void setJsonBeanProcessorMatcher(JsonBeanProcessorMatcher jsonBeanProcessorMatcher) {\r
@@ -97,13 +144,13 @@ public class JsonConfigFactoryBean implements FactoryBean {
                \r
                jsonConfig.setIgnoreDefaultExcludes(ignoreDefaultExcludes);\r
                \r
+               jsonConfig.setJsonPropertyFilter(jsonPropertyFilter);\r
+\r
                for(Class clazz : jsonBeanProcessors.keySet()) {\r
                        jsonConfig.registerJsonBeanProcessor(clazz, jsonBeanProcessors.get(clazz));\r
                }\r
                \r
-               for(PropertyFilter propertyFilter : jsonPropertyFilters) {\r
-                   jsonConfig.setJsonPropertyFilter(propertyFilter);\r
-               }\r
+               \r
 \r
                \r
                for(Class clazz : jsonValueProcessors.keySet()) {\r