GWT + Java: глобалы, синглтоны и головные боли - PullRequest
1 голос
/ 24 августа 2010

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

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

Файловая система / PRODUCTVERSION + TestType / uniqueDateAndBuildID / TestNG-Results.xml

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 26 августа 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: Если вы ищете хорошие идеи / советы о том, как сделатькод менее связанный -> более тестируемый, я бы порекомендовал блог Misko Hevery .У него много интересных постов, например , почему синглтоны обычно плохие (глобальное состояние, а не сам шаблон).Но самое главное - у него есть замечательное руководство по написанию тестируемого кода (некоторые рекомендации используются внутри Google).

1 голос
/ 25 августа 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, и она будет у вас в коде на стороне клиента.

1 голос
/ 25 августа 2010

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

...