GWT+Java: глобальные переменные, синглтоны и головные боли

Итак, вот мой проект:

Я создаю центральный интерфейс/панель инструментов для представления тестовых данных для нескольких типов тестов нескольких версий продукта. Мы используем TestNG в нашем массовом продукте, и хотя тестов пишется недостаточно, это обсуждение для другой темы. Вот как выглядит структура каталогов:

Файловая система/productVersion+testType/uniqueDateAndBuildID/testng-results.xml

Этот файл results.xml содержит теги с дочерними тестовыми тегами, которые соответствуют каталогу файловой системы, а затем файлы xml, содержащие фактические результаты тестового примера (пройдено, не пройдено и т. д.). Анализ XML и обход файловой системы - все хорошо и хорошо/надежно.

Поток управления: клиент обращается к главной странице --> сервер открывает файл свойств --> сервер проверяет свойства веб-сервера (либо Websphere, либо Tomcat, если я работаю локально) --> сервер устанавливает набор констант на основе этого. Константы включают в себя: корневой каталог файловой системы, разделитель файловой системы (перевод), «подобные типы (в основном одинаковые тесты на разных платформах)» и базовый URL-адрес для добавления. --> затем сервер еще немного читает файл свойств и выполняет всю обработку XML. Результаты кэшируются в памяти, а также в файловой системе с использованием ObjectOutputStream. --> Клиенту отправляется большой список результатов для обработки/отображения пользовательского интерфейса.

Вот где я столкнулся с проблемой: я не могу получить доступ к этим глобальным переменным (содержащимся/установленным в классе Globals... плохо, что я знаю :-/) обратно на клиенте, даже если они находятся в общей папке. Если вам интересно, почему я не могу просто снова загрузить свойства, это потому, что клиент представляет собой GWT-ориентированный Javascript, который не включает File(). Итак, моя следующая мысль, после небольшого чтения Java на верхнем уровне, заключалась в том, чтобы, возможно, использовать одноэлементный объект Globals и передать его обратно ... но похоже, что это так же плохо, если не невозможно. Предложения здесь были бы замечательными.

Все это довольно тесно связано, чего мое предыдущее образование в области Java еще не касалось. И поскольку это всего лишь внутренний портал для проверки разработчиками, кажется, нет особого смысла тестировать мой код. Пока он отображается правильно, правильно регистрируется и изящно обрабатывает ошибки, верно? В целом это ‹15 классов, так что это не очень большое дело, я думаю. Должен ли я провести рефакторинг, чтобы очистить все это и сделать его «лучше Java», прокомментировать все, чтобы четко разграничить поток управления, или не слишком беспокоиться об этом, потому что он маленький? Я знаю, что в будущем нужно больше думать о вещах, прежде чем разрабатывать их, но я действительно не знал большого количества высших принципов Java, с которыми я столкнулся с самого начала.

редактировать, немного подумав, нашел возможный обходной путь. Как насчет того, чтобы вместо того, чтобы возвращать только список результатов, я вернул какую-то другую реализацию пользовательского списка, которая включала объект заголовка globals? Я мог бы сохранить состояние.


person xtremerunnerars    schedule 24.08.2010    source источник


Ответы (3)


Вы можете передать эти глобальные переменные, используя простой объект с HashMap, который представляет собой вызов GWT-RPC, или просто включить этот Hashmap с результатом, который вы уже получили в первую очередь (в «большом списке результатов, [которые] отправляются обратно в клиент для обработки/отображения пользовательского интерфейса").

person Thomas    schedule 24.08.2010

Простым решением будет Dictionary класс:

Обеспечивает динамический поиск пар строк ключ/значение, определенных на главной HTML-странице модуля. Каждый уникальный экземпляр Dictionary привязан к именованному объекту JavaScript, который находится в глобальном пространстве имен объекта окна главной страницы. Связанный объект JavaScript используется непосредственно как ассоциативный массив.

Вам просто нужно добавить некоторый динамический контент на HTML-страницу вашего хоста — заставить сервер печатать значения, считанные из файла свойств, в виде объекта JavaScript:

var GlobalProperties = {
  property1: "value1",
  property2: "value2"
};

Затем используйте словарь в своем коде, чтобы прочитать эти значения:

Dictionary globalProperties = Dictionary.getDictionary("GlobalProperties");
String property1 = globalProperties.get("property1");

PS: Если вы ищете хорошие идеи/советы о том, как сделать ваш код менее связанным -> более тестируемым, я бы порекомендовал Блог Миско Хевери. У него много интересных постов, например, почему одиночки обычно плохие (глобальное состояние, а не сам шаблон). Но самое главное — в нем есть прекрасное руководство по написанию тестируемого кода (некоторые рекомендации используются внутри в Гугле).

person Igor Klimer    schedule 25.08.2010

Вы не можете получить доступ к синглтонам на стороне сервера из скомпилированного javascript.

У вас есть два варианта в основном. Вы можете создать класс Serializable в клиентском коде, представляющий глобальные переменные, или передать свой объект глобальных переменных, но это довольно неэффективное решение.

Самый простой способ — использовать HashMap<String, String> в сериализуемом объекте, который можно получить с помощью вызова RPC:

public class GwtGlobalVariables implements Serializable {
    private HashMap<String, String> map = new HashMap<String, String>();

    public void put(// a  delegate put method of choice

    public void setMap() // a getter / setter for the map if you need it
}

Убедитесь, что класс находится в исходных папках модуля GWT, то есть, возможно, в том же месте, что и ваша точка входа.

Заполните карту необходимыми значениями, передайте ее через rpc, и она будет у вас в коде на стороне клиента.

person Jes    schedule 25.08.2010