Архитектура Dudgex

advertisement
1 Архитектура Dudge
Система-арбитр Dudge написана на языке программирования Java.
Поскольку Dudge является
веб-приложением, для его
запуска
необходим сервер приложений. В качестве сервера приложений Dudge
использует GlassFish.
Взаимодействие Dudge, GlassFish и JVM схематично изображено на
рисунке 1:
Dudge
GlassFish Server
Java Virtual Machine
Рис. 1 – Взаимодействие Dudge, GlassFish и JVM
Dudge состоит из 3 основных уровней:
 уровень клиента (рисунок 2);
 бизнес уровень (J2EE сервер) (рисунок 3);
 уровень хранения данных (EIS уровень) (рисунок 4).
Уровень клиента
Web клиент
Оффлайн клиент
Рис. 2 – Уровень клиента
В качестве J2EE сервера Dudge использует GlassFish, а EIS уровень
представляет собой базу данных, находящуюся под управлением СУБД
PostgreSQL. Аббревиатура EIS расшифровывается как Enterprise Information
Systems. Уровень EIS предложен спецификацией J2EE. К нему относятся
хранилища данных и сторонние приложения, напрямую взаимодействующие
с ними в обход Бизнес Уровня системы, но являющиеся при этом её частью.
Также
к
этому
уровню
использующиеся приложением.
относятся
платформозависимые
модули,
J2EE сервер
Web контейнер
Java Web приложение
Servlets
JSPs
EJB контейнер
Session Beans
JPA Entities
Data Source
Рис. 3 – Бизнес уровень системы
Уровень EIS
Модуль проверки решений
Database
Рис. 4 – Уровень хранения данных
Dudge создан с использованием технологии EJB (Enterprise Java Beans).
Он состоит из 4 модулей:
1) dudge-ejb – в этом модуле реализована основная логика системы. В
свою очередь, этот модуль содержит 2 класса, в которых
реализована большая часть бизнес-логики:
 DudgeBean – основной класс системы (рисунок 5). Он реализует
два интерфейса: DudgeLocal и DudgeRemote. В DudgeRemote
объявлены только 2 метода – getSolutionEager и saveSolution. Они
нужны для обмена информацией о сданном решении и статусе
его проверки между DudgeBean и SlaveBean (модуль проверки).
Остальные методы, необходимые для работы основного класса
системы, объявлены в интерфейсе DudgeLocal;
 PermissionCheckerBean
–
класс,
использующийся
другими
классами системы для проверки прав пользователя на то или
иное действие. Его UML диаграмма представлена на рисунке 6.
Данный класс реализует интерфейс PermissionCheckerRemote.
Рис. 5 – UML-диаграмма класса DudgeBean
Рис. 6 – UML-диаграмма класса PermissionCheckerBean
Кроме того, в модуле dudge-ejb находятся классы сущностей,
используемых в контексте работы системы. Например: Contest, Language,
Problem, Role, Solution и т.д. Для каждой из этих сущностей реализовано
объектно-реляционное отображение (маппинг) на базу данных путём
использования JPA-аннотаций.
2) dudge-lib – содержит классы, использующиеся в других модулях.
3) dudge-slave – содержит класс, использующийся для проверки
решений – SlaveBean, который реализует интерфейс SlaveLocal,
представленный на рисунке 7. Данный интерфейс декларирует
только 1 метод – testSolution.
Рис. 7 – UML-диаграмма класса SlaveBean
4) dudge-war – в данном модуле находится реализация веб-интерфейса
проекта.
При
создании
UI
использовались
JSP
(JavaServer
Pages) страницы, компоненты библиотеки Ext JS и Фреймворк
Struts.
Основной функцией системы-арбитра Dudge является проверка
решений задач по программированию. Решения отправляются участниками
соревнования в виде исходного кода. IDEF0 диаграмма для процесса
проверки решений, присланных участниками, представлена на рисунке 8.
EntityManager
MessageProducer
Исходный код решения
GlassFish JMS implementation
Сохранить
информацию о
решении в БД
SourceCompiler
1
Отправить
решение в
очередь
EntityManager
2
Получить
решение
Статус завершения процесса проверки
Проверить
решение
3
SolutionsQueue
4
SlaveBean
Сохранить
информацию о
проверке
решения в БД
5
DudgeBean
Рис. 8 – IDEF0-диаграмма для процесса проверки решения
Информация о ходе и результатах проверки решения сохраняется в
базу данных и
в дальнейшем доступна для участников соревнований,
организаторов и администраторов через веб-интерфейс системы.
Система Dudge использует в качестве СУБД PostgreSQL 8.4.
PostgreSQL – это свободная объектно-реляционная система управления
базами данных. Сильными сторонами PostgreSQL считаются:
 поддержка БД практически неограниченного размера;
 мощные и надёжные механизмы транзакций и репликации;
 расширяемая система встроенных языков программирования: в
стандартной поставке поддерживаются PL/pgSQL, PL/Perl, PL/Python и
PL/Tcl; дополнительно можно использовать PL/Java, PL/PHP, PL/Py,
PL/R, PL/Ruby, PL/Scheme и PL/sh, а также имеется поддержка загрузки
C-совместимых модулей;
 имеется механизм наследования таблиц;
 легкая расширяемость.
Ограничения в работе PostgreSQL, как СУБД, представлены в таблице 1.
Таблица 1 – Ограничения PostgreSQL
Параметр
Максимальное значение
Максимальный размер базы данных
Нет ограничений
Максимальный размер таблицы
32 Тбайт
Максимальный размер записи
1,6 ТБайт
Максимальный размер поля
1 Гбайт
Максимум записей в таблице
Ограничено размером таблицы
Максимум полей в таблице
250—1600, в зависимости от типов полей
Максимум индексов в таблице
Нет ограничений
База данных Dudge в настоящий момент включает в себя 14 таблиц:
 Applications – в данной таблице хранятся поданные заявки на участие в
соревновании. Таблица содержит следующие поля:
o owner – логин пользователя, отправившего заявку;
o contest_id – идентификатор соревнования, к которому относится
поданная заявка на участие;
o filing_time – время подачи заявки;
o message – текст сообщения;
o status – текущий статус заявки.
Первичный ключ образуют поля owner и contest_id.
Все поля данной таблицы являются обязательными для заполнения.
 Complaints – в данной таблице хранятся замечания от участников.
Таблица содержит следующие поля:
o complaint_id – идентификатор замечания;
o problem_id – идентификатор задачи, к которой относится
замечание;
o owner – логин пользователя, отправившего замечание;
o filing_time – время отправки замечания;
o message – текст замечания.
Первичный ключ – поле complaint_id.
Все поля данной таблицы являются обязательными для заполнения.
 Contest_Languages – данная таблица используется для хранения
соответствий существующих в системе соревнований и языков
программирования. Таблица содержит следующие поля:
o contest_id – идентификатор соревнования;
o language_id – идентификатор языка программирования.
Первичный ключ образуют поля contest_id и language_id.
Все поля данной таблицы являются обязательными для заполнения.
 Contest_Problems – данная таблица используется для хранения
соответствий существующих в системе соревнований и задач. Таблица
содержит следующие поля:
o contest_id – идентификатор соревнования;
o problem_id – идентификатор задачи;
o problem_order – порядковый номер задачи;
o problem_mark – заголовок для данной проблемы в рамках
соответствующего соревнования;
o problem_cost – «стоимость» задачи.
Первичный ключ образуют поля contest_id и problem_id.
Все поля данной таблицы являются обязательными для заполнения.
 Contests – в данной таблице хранится информация о соревнованиях.
Таблица содержит следующие поля
o contest_id – идентификатор соревнования;
o caption – название соревнования;
o description – описание соревнования;
o con_type – тип соревнования;
o start_time – дата и время начала соревнования;
o duration – продолжительность соревнования;
o freeze_time – оставшееся время до конца соревнования, при
котором монитор соревнований становится недоступным для
участников;
o is_open – является ли соревнование открытым для все желающих
принять в нём участие;
o rules – правила соревнования.
Первичный ключ – поле contest_id.
Все поля данной таблицы, за исключением поля description, являются
обязательными для заполнения.
 Languages – в данной таблице хранятся языки программирования.
Таблица содержит следующие поля
o language_id – идентификатор языка программирования;
o title – название языка программирования;
o description – описание языка программирования;
o file_extension – расширение файлов с исходным кодом для
данного языка программирования;
o compilation_cmd – команда для компиляции исходных кодов;
o execution_cmd – команда для выполнения скомпилированной
программы.
Первичный ключ – поле language_id.
Все поля данной таблицы являются обязательными для заполнения.
 News – в данной таблице хранятся новости. Таблица содержит
следующие поля:
o news_id – идентификатор новости;
o author – логин пользователя, добавившего новость;
o adding_time – время создания новости;
o message – текст новости.
Первичный ключ – поле news_id.
Все поля данной таблицы являются обязательными для заполнения.
 Params – в данной таблице хранятся параметры системы. Например,
версия базы данных и идентификатор соревнования по умолчанию.
Таблица содержит следующие поля:
o pname – название параметра;
o pvalue – значение параметра.
Первичный ключ – поле pname.
Все поля данной таблицы являются обязательными для заполнения.
 Problems – в данной таблице хранятся задачи. Таблица содержит
следующие поля:
o problem_id – идентификатор задачи;
o owner – логин пользователя, добавившего задачу;
o title – название задачи;
o is_hidden – является ли задача скрытой, т.е. недоступной для
использования в соревнованиях;
o description – текст задачи;
o create_time – время добавления задачи;
o memory_limit – лимит памяти, потребляемой программой во
время выполнения;
o cpu_time_limit – лимит процессорного времени для выполнения
программы;
o real_time_limit – лимит фактического времени выполнения
программы;
o output_limit – лимит на объём выходных данных программы;
o is_healthy – является ли задача «здоровой». При добавлении
новых тестов к задаче, в данное поле устанавливается значение
false. Если отправленное участником соревнования решение
задачи успешно проходит все тесты, в данное поле задачи
устанавливается значение true.
o author – автор задачи;
Первичный ключ – поле problem_id.
Все поля данной таблицы являются обязательными для заполнения.
 Roles – в данной таблице хранятся роли пользователей. Таблица
содержит следующие поля:
o contest_id – идентификатор соревнования;
o username – логин пользователя;
o role_type – роль пользователя в данном соревновании.
Первичный ключ образуют поля contest_id, username и role_type.
Все поля данной таблицы являются обязательными для заполнения.
 Runs – в данной таблице хранится информация о выполнении тестов.
Таблица содержит следующие поля:
o solution_id – идентификатор решения задачи;
o test_id – идентификатор теста;
o run_number – число запусков;
o result_type – результат выполнения теста;
o memory – максимальное значение памяти, потребляемой во время
выполнения программы;
o cpu_time – процессорное время выполнения программы;
o real_time – фактическое время выполнения программы.
Первичный ключ образуют поля solution_id и test_id.
Все поля данной таблицы являются обязательными для заполнения.
 Solutions – в данной таблице хранятся присланные участниками
решения задач. Таблица содержит следующие поля:
o solution_id – идентификатор решения задачи;
o submit_time – время отправки решения задачи;
o username – логин пользователя, отправившего решение задачи;
o contest_id – идентификатор соревнования;
o problem_id – идентификатор задачи;
o language_id – идентификатор языка программирования;
o source_code – исходный код решения задачи;
o status – статус обработки решения задачи;
o status_message – текст сообщения для статуса обработки решения
задачи;
o compilation_time – время компиляции исходного кода решения
задачи.
Первичный ключ – поле solution_id.
Все поля данной таблицы являются обязательными для заполнения.
 Tests – в данной таблице хранятся тесты для задач. Таблица содержит
следующие поля:
o test_id – идентификатор теста для задачи;
o problem_id – идентификатор задачи;
o test_number – порядковый номер теста для задачи;
o input_data – входные данные;
o output_data – выходные данные.
Первичный ключ – поле test_id.
Все поля данной таблицы являются обязательными для заполнения.
 Users – в данной таблице хранится информация о пользователях.
Таблица содержит следующие поля:
o login – логин пользователя;
o pwd_hash – хэш-код для пароля;
o email – электронная почта пользователя;
o real_name – имя пользователя;
o organization – организация/ВУЗ пользователя;
o register_date – дата регистрации пользователя;
o age – возраст пользователя;
o jabber_id – jabber пользователя;
o icq_number – icq пользователя;
o is_admin – является ли пользователь администратором;
o can_create_contest – может ли пользователь создавать новые
соревнования;
o can_create_problem – может ли пользователь добавлять в систему
новые задачи.
Первичный ключ – поле login.
Все поля данной таблицы, за исключением полей age и icq_number,
являются обязательными для заполнения.
Также
в
БД
хранится
6
последовательностей
(Sequence),
использующихся для автоматической генерации первичных ключей в
таблицах Complaints, Contests, News, Problems, Solutions и Tests. При
добавлении в таблицу новой записи, в качестве первичного ключа ей
устанавливается текущее значение последовательности.
После чего,
значение последовательности увеличивается на 1.
Даталогическая модель базы данных представлена на рисунке 10. В
данной модели все линии связей имеют отношение 1 к N.
Рис. 10 – Даталогическая модель базы данных Dudge
Download