• Как запустить выполнение unit-тестов в Dojo?

    @nikolaas Автор вопроса
    Все. Разобрался сам. Если кому интересно, вот решение:
    Привел проект к такой структуре (это было не обязательно, но пришлось сделать для других целей):
    project_root
    |--src
        |-- main
             |-- webapp
                  |-- index.html
                  |-- js
                       |-- dtk
                            |-- dojo
                            |-- dijit
                            |-- dojox
                            |-- util
                       |-- jla
                            |-- some
                                 |-- module.js
                       |-- test
                            |-- dojo-test.sh
                            |-- dojo-test-config.js
                            |-- jla
                                 |-- root-test.js
                                 |-- some
                                      |-- test.js

    Код скрипта dojo-test.js:
    #!/bin/bash
    
    # Скрипт для запуска тестов проект. Имеет два способа запуска:
    # 1) Запуск тестирования всего проекта:
    #      ./dojo-test.sh
    #    При этом в качестве основного теста выступает тест 
    #    ${project_root}/jla-web-app/src/main/webapp/js/test/jla/root-test.js,
    #    который запускает остальные тесты
    # 2) Запуск конкретного теста:
    #      ./dojo-test.sh -t test/some/test
    
    format() {
        printf "    %25s:  %s\n" $1 $2
    }
    
    # как оказалось запускать тестирование нужно из этой директории (тут путь взят относительно директории скрипта):
    cd ../dtk/util/doh
    
    CURRENT_DIR='.'
    SOURCE_DIR='../../../'
    PROJECT_DIR=$SOURCE_DIR'../../../../'
    DOJO_DIR=$SOURCE_DIR'dtk/dojo'
    DOJO_JS=$DOJO_DIR'/dojo.js'
    RHINO=$SOURCE_DIR'dtk/util/shrinksafe/js.jar'
    CONFIG_FILE=$SOURCE_DIR'test/dojo-test-config.js'
    
    TARGET_MODULE=
    if [ "$1" = "-t" ] ; then
        shift
        TARGET_MODULE=$1
        shift
    else
        TARGET_MODULE='test/root-test'
    fi
    
    echo''
    echo 'Testing project '$(readlink -f $PROJECT_DIR)':'
    echo''
    format 'RHINO' $RHINO
    format 'DOJO.JS' $DOJO_JS
    format 'BASE_URL' $DOJO_DIR
    format 'CONFIG' $CONFIG_FILE
    format 'TESTS' $TARGET_MODULE
    echo''
    echo 'Run test '$TARGET_MODULE'...'
    
    java -jar $RHINO $DOJO_JS baseUrl=$BASE_URL load=$CONFIG_FILE load=doh test=$TARGET_MODULE

    Содержимое файла конфига (который dojo-test-config.js):
    require({
        //пути задаются относительно файла dojo.js
        paths: {
            //путь к исходникам jla
            "jla" : "../../jla",
            //путь к тестам jla
            "test" : "../../test/jla"
        }
    });

    Все. Теперь храним исходники в директории
    ${project_root}/src/main/webapp/js/jla
    Все тесты хранятся в директории
    ${project_root}/src/main/webapp/js/test/jla
    Пример теста ${project_root}/src/main/webapp/js/test/jla/some/test.js:
    define(["doh/runner"], function(doh) {
        doh.register("Tests group name", {
            name: "Test name",
            setUp: function() {
                  //тут инициализация чего
            },
            runTest: function() {
                require(["jla/some/module"], function(module) {
                    //тут собственно тестируем наш модуль module
                });
            },
            tearDown: function() {
                //тут действия после тестирования    
            }
        });
    });

    Запускать скрипт dojo-test.sh нужно из этой директории
    ${project_root}/src/main/webapp/js/dtk/util/doh
    с помощью команды:
    ./dojo-test.sh -t test/some/test
    Либо если у вас есть несколько тестов и вы хотите запустить их все сразу, то нужно создать в директории
    ${project_root}/src/main/webapp/js/test/jla/
    файл root-test.js следующего содержания:
    define([
        "doh/runner",
        "test/some/test1",
        "test/some/test2"
        //собственно тут перечисляем все тесты, которые хотим запустить
    ], function(doh) {
        return 1;//почему-то нужно что-то обязательно вернуть, вероятно по другому Dojo Loader не понимает, что это модуль и не грузит его
    });

    И запускаем скрипт dojo-test.sh с помощью команды:
    ./dojo-test.sh

    Также есть возможность запускать тестирование из браузера. Для этого нужно открыть следующий адрес (адрес дан для моего примера):
    http://sin2/js/dtk/util/doh/runner.html?paths=jla,../../../js/jla;test,../../../js/test/jla&test=test/some/test

    У меня поднят web-сервер Apachе, который разрешает sin2 в директорию
    ${project_root}/src/main/webapp/
    Собственно про параметры. Первый параметр
    paths=jla,../../../js/jla;test,../../../js/test/jla

    делает тоже самое что и конфиг-файл dojo-test-config.js - задает пути, в которых dojo будет искать исходные файлы модулей и тестов.
    Второй параметр
    test=test/some/test
    задает тест который будет запущен.
    В нашем случае для запуска всех тестов можно сразу было задать этот параметр в таком виде:
    test=test/root-test
    Ответ написан
    Комментировать
  • Почему чтение blob-а из hsqldb вызывает ошибку java.lang.IndexOutOfBoundsException?

    @nikolaas Автор вопроса
    Вопрос закрыт. Проблема была в строке Tools.closeSilent(is); метода
    public void write(TypeHandlerContext context, ResultSet resultSet, Object value)
    , которая закрывала InputStream до вызова resultSet.updateRow. Видимо на oracle и postgresql при вызове
    resultSet.updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException
    происходит копирование данных из переданного потока, а в hsqldb сохраняется ссылка на него.
    Ответ написан
    Комментировать
  • Как сделать подгрузку изображений к списку?

    По хорошему, с точки зрения архитектуры, вам не нужно прокидывать комбобокс в TransformingCanvas, потому что его задача заключается в отрисовке изображений. Но откуда изображения берутся это уже второй вопрос. Я бы ввел какой нибудь интерфейс, например:
    public interface ImageProvider {
        Image getImage();
    }


    В TransformingCanvas завел бы поле ImageProvider и сеттер для него. При нажатии на кнопку вы устанавливаете через сеттер соответствующую реализацию ImageProvider
    При отрисовке TransformingCanvas должен брать изображение из ImageProvider. Остается один вопрос: как оповестить TransformingCanvas об изменении изображения и о необходимости перерисовки? Способов решения много. Самый простой: в сеттере для ImageProvider явно вызывать перерисовку TransformingCanvas. Можно также через слушателя, регистрируемого в ImageProvider.

    p.s. И еще. Я не знаю конечно специфики вашего TransformingCanvas, но в общем случае лучше переопределять не метод JComponent.paint(Graphics g), а JComponent.paintComponent(Graphics g) Метод paint определяет весь алгоритм рисования компонента, включая его границу и его дочерние компоненты, в то время как paintComponent рисует только сам компонент. Переопределив paint, вам придется самому заморачиваться с рисованием дочерних компонентов, если конечно это потребуется. Почитайте документацию в этим методам, там все описано.
    Ответ написан
    1 комментарий