Прошу покритиковать код поиска объекта. Особенно не уверен в findEngineReserv
У меня desctop Java-приложение на платформе NetBeans(swing, динамическое дерево объектов).
//////////////////////////////////////////////////////////////// //Общая функция поиска объектов, резервная функция поиска объекта, конструктор поиска объекта и функция поиска конкретных объектов /////////////////////////////////////////////////////////////// //findEngine - ищет конкретный объект по заданным variable и property с указанной глубиной depth в указанном объекте mainObj //findEngineReserv - если findEngine не находит объект, данная функция пытается найти его другими способами //findConstructor - если искомый объект нужно найти в объекте, отличном от корневого, эта функция находит находит второй и передает его в findEngine //findObj(название объекта) - поиск конкретных объектов, основная функция, которая вызывается в других скриптах. В switch/case указаны свойства и значения для поиска объектов. //Поиск объектра function findEngine(variable, property, depth, mainObj) { depth = depth == null?50:depth; var result = mainObj.FindAllChildren(variable, property, depth); result = (new VBArray(result)).toArray(); //здесь периодически появляется ошибка и ругается на VBArray if (result.length > 1) { Log.Warning("Надено более 1 объекта методом FindAllChildren. По умолчанию выбран первый объект. Необходимо уточнить поиск в findObj. Найдено объектов: " + result.length); } return result.length == 0?findEngineReserv(variable, property, depth, mainObj):result[0]; } //Резервный поиск объектра function findEngineReserv(variable, property, depth, mainObj) { Log.Message("Работает резервный поиск объектов"); if (!mainObj.Exists) { return Log.Error("Объект MainObj не найден"); } var time = 5; var temp = 0; while (temp < time) { Log.Message ("Этап резервного поиска объекта : " + temp); Delay(100); var resultObj = mainObj.FindChild(variable, property, 30); if (resultObj.Exists) { return resultObj; } temp++; } var temp1 = 0; while (temp1 < 300) { Log.Message ("Этап резервного поиска объекта с Refresh(): " + temp1); Delay(100); resultObj.Refresh(); if (resultObj.Exists) { return resultObj; } temp1 += 100; } Log.Warning("Объект найден с затруднениями", "Variables: " + variable.toString() + "\nProperty: " + property.toString()); return resultObj; } //Конструктор поиска объекта, function findConstructor(variable, property, depth, variableMain, propertyMain, depthMain) { if (variableMain&&propertyMain) { var mainObj = findEngine(variableMain, propertyMain, depthMain); } else { var mainObj = Sys.WaitProcess("javaw", 20000); } return findEngine(variable, property, depth, mainObj); } //Поиск конкретных объектов function findObj(searchObj) { var variable, property, depth, variableMain, propertyMain, depthMain; switch(searchObj) { //Возвращает object Всплывающего окна case "BasicComboPopup": var variable = ["JavaClassName", "VisibleOnScreen"]; var property = ["BasicComboPopup$1", true]; var depth = 18; break; //Возвращает object Конфигурации case "Configuration": var variable = ["JavaClassName", "VisibleOnScreen"]; var property = ["TreeView$ExplorerTree", true]; var depth = 9; var variableMain = ["JavaClassName", "VisibleOnScreen", "AWTComponentAccessibleName"]; var propertyMain = ["ProjectManagerTopComponent", true, "Проект"]; var depthMain = 18; break; } return findConstructor(variable, property, depth, variableMain, propertyMain, depthMain); }