From 33d5d4c64841cd4112606a7f0ec5e5366b01346c Mon Sep 17 00:00:00 2001
From: juanf <juanf>
Date: Tue, 8 Dec 2015 10:40:56 +0000
Subject: [PATCH] SSDM-2788 : Refactoring to include special classes with
 circular dependencies

SVN: 35243
---
 .../html/test/test-jsVSjava.js                | 75 +++++++++++++------
 1 file changed, 51 insertions(+), 24 deletions(-)

diff --git a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-jsVSjava.js b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-jsVSjava.js
index 83a16584fdb..aa34ba2a33c 100644
--- a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-jsVSjava.js
+++ b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-jsVSjava.js
@@ -28,13 +28,6 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 			callback();
 		}
 		
-		var notCheckedButWeShould = function(testsResults, javaClassReport, callback) {
-			var warningResult = "Java class ignored, exists in custom file, special case not validated yet: " + javaClassReport.name;
-			testsResults.warning.push(warningResult);
-			console.info(warningResult);
-			callback();
-		}
-		
 		var javaLevelHandlers = {
 				"AbstractCollectionView" : ignoredHandler,
 				"ListView" : ignoredHandler,
@@ -55,13 +48,19 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 				"DataSetFileSearchCriteria" : toBeImplementedHandler,
 				"DataSetFile" : toBeImplementedHandler,
 				"DataSetFilePermId" : toBeImplementedHandler,
-				"IDataSetFileId" : toBeImplementedHandler,
-				"DataSetChildrenSearchCriteria" : notCheckedButWeShould,
-				"DataSetContainerSearchCriteria" : notCheckedButWeShould,
-				"DataSetParentsSearchCriteria" : notCheckedButWeShould,
-				"SampleChildrenSearchCriteria" : notCheckedButWeShould,
-				"SampleContainerSearchCriteria" : notCheckedButWeShould,
-				"SampleParentsSearchCriteria" : notCheckedButWeShould
+				"IDataSetFileId" : toBeImplementedHandler
+		}
+		
+		//
+		// JS Classes contained into other classes
+		//
+		var circularDependencies = {
+				"SampleChildrenSearchCriteria" : 	{ containerClass : "dto.sample.search.SampleSearchCriteria",  	method : "withChildren" },
+				"SampleContainerSearchCriteria" : 	{ containerClass : "dto.sample.search.SampleSearchCriteria",  	method : "withContainer" },
+				"SampleParentsSearchCriteria" : 	{ containerClass : "dto.sample.search.SampleSearchCriteria",  	method : "withParents" },
+				"DataSetChildrenSearchCriteria" : 	{ containerClass : "dto.dataset.search.DataSetSearchCriteria",  method : "withChildren" },
+				"DataSetContainerSearchCriteria" : 	{ containerClass : "dto.dataset.search.DataSetSearchCriteria",  method : "withContainer" },
+				"DataSetParentsSearchCriteria" : 	{ containerClass : "dto.dataset.search.DataSetSearchCriteria",  method : "withParents" },
 		}
 		
 		//
@@ -77,16 +76,25 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 			}
 			
 			//Check prototype available
-			if(!jsObject.prototype) {
+			if(!jsObject.prototype && !jsObject.__proto__) {
 				var errorResult = "JS class missing prototype: " + javaClassReport.jsonObjAnnotation;
 				testsResults.error.push(errorResult);
 				console.info(errorResult);
 				return;
 			}
 			
+			var jsPrototype = null;
+			if(jsObject.__proto__) {
+				jsPrototype = jsObject.__proto__;
+			}
+			
+			if(jsObject.prototype) {
+				jsPrototype = jsObject.prototype;
+			}
+			
 			//Java Fields found in Javascript
 			for(var fIdx = 0; fIdx < javaClassReport.fields.length; fIdx++) {
-				if(!jsObject.prototype[javaClassReport.fields[fIdx]]) {
+				if(!jsPrototype[javaClassReport.fields[fIdx]]) {
 					var errorResult = "JS class missing field: " + javaClassReport.jsonObjAnnotation + " - " + javaClassReport.fields[fIdx];
 					testsResults.error.push(errorResult);
 					console.info(errorResult);
@@ -95,7 +103,7 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 			
 			//Java Methods found in Javascript
 			for(var fIdx = 0; fIdx < javaClassReport.methods.length; fIdx++) {
-				if(!jsObject.prototype[javaClassReport.methods[fIdx]]) {
+				if(!jsPrototype[javaClassReport.methods[fIdx]]) {
 					var errorResult = "JS class missing method: " + javaClassReport.jsonObjAnnotation + " - " + javaClassReport.methods[fIdx];
 					testsResults.error.push(errorResult);
 					console.info(errorResult);
@@ -130,11 +138,18 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 						var javaClassName = javaClassReport.name;
 						var javaSimpleClassName = getSimpleClassName(javaClassName);
 						var javaLevelHandler = javaLevelHandlers[javaSimpleClassName];
+						var circularDependencyConfig = circularDependencies[javaSimpleClassName];
 						
 						if(javaLevelHandler) {
 							javaLevelHandler(testsResults, javaClassReport, doNext);
 						} else {
-							var jsClassName = javaClassReport.jsonObjAnnotation;
+							var jsClassName = null;
+							if(circularDependencyConfig) {
+								jsClassName = circularDependencyConfig.containerClass;
+							} else {
+								jsClassName = javaClassReport.jsonObjAnnotation;
+							}
+							
 							if(jsClassName) {
 								var failedLoadingErrorHandler = function(javaClassName) {
 									return function() {
@@ -145,13 +160,25 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 									};
 								};
 								
-								var loadedHandler = function(javaClassReport) {
-									return function(jsObject) {
-										defaultHandler(testsResults, javaClassReport, jsObject);
-										testsResults.info.push("Java class matching JS: " + javaClassReport.name);
-										doNext();
+								var loadedHandler = null;
+								
+								loadedHandler = function(circularDependencyConfig) {
+									return function(javaClassReport) {
+										return function(jsObject) {
+											if(circularDependencyConfig) {
+												var instanceJSObject = new jsObject();
+												var containedJsObject = instanceJSObject[circularDependencyConfig.method]();
+												jsObject = containedJsObject;
+											}
+											
+											defaultHandler(testsResults, javaClassReport, jsObject);
+											testsResults.info.push("Java class matching JS: " + javaClassReport.name);
+											doNext();
+										};
 									};
-								};
+								}
+								
+								loadedHandler = loadedHandler(circularDependencyConfig);
 								
 								var requireJsPath = jsClassName.replace(/\./g,'/');
 								require([requireJsPath], loadedHandler(javaClassReport), failedLoadingErrorHandler(javaClassName));
-- 
GitLab