Анализ предметной области и проектирование базы данных

advertisement
Государственное образовательное учреждение высшего профессионального
образования
“Санкт-Петербургский государственный электротехнический
университет “ЛЭТИ” им. В.И.Ульянова (Ленина)”
кафедра МОЭВМ
КУРСОВАЯ РАБОТА
на тему
«Разработка модуля администрирования и
портала для сети кинотеатров»
Выполнили:
Рак Е.Ю.
Романенко Д.А.
Сорокин М.Е.
Группа:
Факультет:
6395
КТИ
Проверил:
Кринкин К.В.
Санкт-Петербург
2010
Оглавление
Описание задачи ........................................................................................... 3
Постановка задачи ...................................................................................................... 3
Цель работы ................................................................................................................. 3
Анализ предметной области и проектирование базы данных ............ 4
Анализ предметной области ...................................................................................... 4
Описание таблиц базы данных ................................................................................... 6
Архитектура приложения........................................................................... 9
Серверная часть ........................................................................................................ 10
Клиентская часть ...................................................................................................... 10
Руководство оператора ............................................................................. 13
Назначение программного комплекса ...................................................................... 13
Условия выполнения программного комплекса ....................................................... 13
Требования к техническим средствам ........................................................................................13
Требования к программному обеспечению ................................................................................13
Выполнение программного комплекса для сотрудников кинотеатра ................. 14
Начало работы с программным комплексом..............................................................................14
Работа со справочником «Сотрудники» .....................................................................................15
Права доступа в ПК «КиноАдминистратор»..............................................................................17
Выполнение программного комплекса для пользователей .................................... 17
Начало работы с программным комплексом..............................................................................17
Работа со справочником «Кинотеатров» ....................................................................................18
Права доступа ................................................................................................................................19
Контрольный пример................................................................................................. 19
Контрольный пример по регистрации сотрудника ПК «КиноАдминистратор» ....................19
Контрольный пример по регистрации пользователя ПК ..........................................................20
Сообщения оператору ............................................................................................... 21
Руководство программиста ...................................................................... 22
Инсталляция программного комплекса ................................................................... 22
Запуск процесса установки и выбор варианта установки программного комплекса.............22
Загрузка содержимого базы данных ...........................................................................................22
Установка приложения .................................................................................................................22
Входные и выходные данные ......................................................................................................24
Выводы ......................................................................................................... 25
Приложение 1. Текст программы ........................................................... 26
Приложение 2. Ссылка на электронный ресурс .................................. 47
-2-
Описание задачи
ПОСТАНОВКА ЗАДАЧИ
Программный комплекс (ПК) должен обеспечивать поддержку процессов
эксплуатации и администрирования сети кинотеатров. К основным процессам
администрирования относятся: учет кинотеатров, информации о залах и
расположении мест в них, учет фильмов, управление сеансами, а также учет
сотрудников. Сотрудники сети кинотеатров должны иметь возможность заказа
мест на заданный сеанс.
Также
ПК должен предоставить для пользователей сети Интернет
возможность просмотра информации о кинотеатрах, репертуаре фильмов,
которые демонстрируются в кинотеатре. Пользователь сети Интернет должен
иметь возможность заказа билетов на определенный сеанс и определенное место в
зале кинотеатра.
ЦЕЛЬ РАБОТЫ
Целью данной курсовой работы является проектирование и разработка
модуля администрирования и вэб-интерфейса, соответствующих заданию. В
процессе проектирования необходимо:
 выполнить анализ предметной области;
 спроектировать базу данных по результатам анализа предметной области;
 спроектировать архитектуру приложения;
 сформировать требования к программному обеспечению для обеспечения
функционирования ПК;
 выполнить кодирование и тестирование разработанного программного
обеспечения;
-3-
Анализ предметной области и проектирование базы данных
АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
Администрирование сети кинотеатров заключается в добавлении и
редактировании и удалении информации о кинотеатрах, фильмах, которые
демонстрируются в кинотеатрах, сотрудниках, а также пользователей вэбпортала. Отдельными процессами являются создание сеанса и заказ билетов.
Информацией о кинотеатре является его название, а также адрес. Данная
информация должна отображаться как сотрудникам, так и интернетпользователям (при доступе через интернет данная информация недоступна для
редактирования). Для каждого кинотеатра существует возможность создания
залов с заданным числом рядов и мест в каждом зале. Каждый зал может быть
использован для показа любого фильма.
Фильм
обладает
следующими
характеристиками:
название,
продолжительность, описание, год выпуска. Интернет-пользователи могут только
просматривать информацию о фильмах, в то время как сотрудники кинотеатров
имею доступ к редактированию этой информации.
Для предоставления возможности заказа билетов сотруднику необходимо
создать сеанс, назначив кинотеатр, зал и время показа, а также фильм, который
будет демонстрироваться. После этого сотрудники и зарегистрированные
интернет-пользователи получают возможность заказа билетов.
Каждый сотрудник сети кинотеатров должен иметь свой уникальный логин
для входа в систему, а также пароль для аутентификации данного пользователя
системы. Интернет-пользователи вэб-портала имеют возможность регистрации в
системе для последующего заказа билетов.
Необходимо предусмотреть невозможность заказа билетов на уже занятые
места, а также сохранение информации об интернет-заказчиках для последующей
реализации забронированных билетов.
Также необходимо обеспечить невозможность заказа билетов через сеть
интернет незарегистрированными пользователям.
На основе описанных процессов можно построить диаграмму вариантов
использования ПК (рис.1).
-4-
Создание,
редактирование,
удаление кинотеатра
Создание, удаление
зала
Создание,
редактирование,
удаление фильма
Заказ билетов
Создание,
редактирование,
удаление сотрудника
Просмотр сеансов
Вход в портал
в качестве
зарегистрированного
пользователя
Вход систему
Создание, удаление
сеанса
Просмотр кинотеатров
Просмотр фильмов
Просмотр и
удаление заказов
Просмотр интернетпользователей
Регистрация в
портале
Сотрудник
кинотеатра
Незарегистрированный
интернет-пользователь
Просмотр залов
Рис 1. Варианты использования ПК
ОПИСАНИЕ ТАБЛИЦ БАЗЫ ДАННЫХ
В результате анализа предметной области была спроектирована база данных.
Спроектированная база данных отражает сущности предметной области, а также
содержит вспомогательные таблицы для работы приложения.
База данных состоит из следующих таблиц:
Film – хранит информацию о фильмах.
Название
поля
Тип поля
id
Целое [INT]
name
Текст [VARCHAR]
duration
Целое [INT]
description Текст [VARCHAR]
year
Целое [INT]
deleted
Целое [TINYINT]
В таблице Film хранится id фильма, название фильма (name), его
продолжительность(duration), описание (description), год выпуска (year) и флаг
удаления (deleted) – если фильм удален, то принимает значение 1, иначе 0.
Session – хранит информацию о сеансах
Название
поля
Тип поля
id
Целое [INT]
date
Дата [TIMESTAMP]
filmid
Целое [INT]
hallid
Целое [INT]
deleted
Целое [TINYINT]
В таблице Session хранится id сессии, дата и время выхода (date), id
фильма(filmid), id зала(hallid) и флаг удаления (deleted) – если сессия удалена то
принимает значение 1, иначе 0. Таблица связана с таблицей фильмы через поле
filmid.
Hall – хранит информацию о залах
Название
поля
Тип поля
id
Целое [INT]
name
Текст [VARCHAR]
typical
Целое [TINYINT]
cinemaid
Целое [INT]
deleted
Целое [TINYINT]
В таблице Hall хранится id зала, имя зала(name), id кинотеатра (cinemaId) и
флаг удаления (deleted) – если зал удален, то принимает значение 1, иначе 0.
Таблица связана с таблицей session через поле hallid.
Place – хранит информацию о местах
Название
поля
Тип поля
id
Целое [INT]
row
Целое [INT]
col
Целое [INT]
hallid
Целое [INT]
deleted
Целое [TINYINT]
В таблице Place хранится id места, ряд (row) и столбец (col) места, id
зала(hallid) и флаг удаления (deleted) – если место удалено то принимает
значение 1, иначе 0. Таблица связана с таблицей hall через поле hallid.
Zakaz – хранит информацию о заказах
Название
поля
Тип поля
id
Целое [INT]
datereserve Дата [TIMESTAMP]
dateend
Дата [TIMESTAMP]
customerid Целое [INT]
uniqnumber Текст [VARCHAR]
placeid
Целое [INT]
deleted
Целое [TINYINT]
В таблице Zakaz хранится id заказа, дата резервирования(datereserve) и
дата окончания(dateend), id заказчика (customerid), id места(placeid), уникальный
номер(uniqnumber) и флаг удаления (deleted) – если заказ удален, то принимает
значение 1, иначе 0. Таблица связана с таблицей place через поле placeid.
Cinema – хранит информацию о кинотеатрах
Название
поля
Тип поля
id
Целое [INT]
name
Текст [VARCHAR]
address
Текст [VARCHAR]
deleted
Целое [TINYINT]
В таблице Cinema хранится id кинотеатра, имя кинотеатра (name), адрес
кинотеатра (address) и флаг удаления (deleted) – если кинотеатр удален, то
-7-
принимает значение 1, иначе 0. Таблица связана с таблицей hall через поле id в
таблице cinema и поле cinemaid в таблице hall.
Customer – хранит информацию о пользователях
Название
поля
Тип поля
id
Целое [INT]
firstname
Текст [VARCHAR]
middlename Текст [VARCHAR]
lastname
Текст [VARCHAR]
login
Текст [VARCHAR]
password
Текст [VARCHAR]
description Текст [VARCHAR]
isweb
Целое [TINYINT]
cinemaid
Целое [INT]
deleted
Целое [TINYINT]
В таблице Customer хранится id клиента/сотрудника, имя (firstname),
отчество (middlename), фамилия(lastname), логин (Login), пароль (password),
описание пользователя (description), идентификатор, определяющий является ли
пользователь сотрудником или клиентом сети (1 – сотрудник, 0 - пользователь),
кинотеатр, к которому прикреплен сотрудник(cinemaid) и флаг удаления (deleted)
– если пользователь удален, то принимает значение 1, иначе 0. Таблица связана с
таблицей cinema через поле cinemaid и с таблицей zakaz через поле id в таблице
customer и поле customerid в таблице zakaz.
Структура и связь таблиц в базе данных приведена на рис.2.
Рис 2. Структура и связь таблиц в базе данных
-8-
Архитектура приложения
Разрабатываемое приложение имеет трехуровневую архитектуру (рис. 3).
Данная реализация предполагает наличие следующих компонентов приложения:
клиентское приложение («толстый» или «тонкий» клиент), подключенное к
серверу приложений, который в свою очередь подключен к серверу базы данных.
Рассмотрим основные принципы реализации составных частей:
 Клиент - это интерфейсный компонент, который представляет первый
уровень, собственно приложение для конечного пользователя. Первый уровень
не должен иметь прямых связей с базой данных (по требованиям безопасности),
быть
нагруженным
основной
бизнес-логикой
(по
требованиям
масштабируемости) и хранить состояние приложения (по требованиям
надежности). На первый уровень может быть вынесена и обычно выносится
простейшая бизнес-логика: интерфейс авторизации, алгоритмы шифрования,
проверка вводимых значений на допустимость и соответствие формату,
несложные операции с данными, уже загруженными на клиент.
 Сервер приложений располагается на втором уровне. На втором уровне
сосредоточена большая часть бизнес-логики.
 Сервер базы данных обеспечивает хранение данных и выносится на третий
уровень.
Рис. 3. Трехуровневая организация приложения
Основными достоинствами трехзвенной архитектуры по сравнению с клиентсерверной архитектурой являются:
 масштабируемость;
 конфигурируемость - изолированность уровней друг от друга позволяет
быстро и простыми средствами переконфигурировать систему при
возникновении сбоев или при плановом обслуживании на одном из уровней;
 высокая безопасность;
-9-
 высокая надежность;
 относительно невысокие требования к скорости канала (сети) между
клиентом и сервером приложений;
 относительно невысокие требования к производительности и техническим
характеристикам клиентов.
СЕРВЕРНАЯ ЧАСТЬ
В качестве объектно-реляционного отображения (ORM) таблиц базы данных
на объекты Java-приложения используется пакет Apache Cayenne. Под ORM
понимается технология программирования, которая связывает базы данных с
концепциями объектно-ориентированных языков программирования, создавая
«виртуальную объектную базу данных».
Для связи с базой данных используется драйвер JDBC (Java DataBase
Connectivity)
—
платформенно-независимый
промышленный
стандарт
взаимодействия Java-приложений с различными СУБД. JDBC основана на
концепции так драйверов, позволяющих получать соединение с базой данных по
специально описанному URL. Загрузившись, драйвер сам регистрирует себя и
вызывается автоматически, когда программа требует URL, содержащий протокол,
за который драйвер отвечает.
Для отображения пользователю вэб-портала используются jsp страницы с
вызовом методов из серверной части приложения.
Взаимодействие между сервером и клиентом осуществляется по HTTPпротоколу.
В качестве средства передачи параметров между клиентом и сервером
используется JSON (JavaScript Object Notation).
Диаграмма классов серверной части представлена на рис.4
КЛИЕНТСКАЯ ЧАСТЬ
В клиентской части толстого клиента реализовано ядро приложения,
обеспечивающее общий подход к созданию списков и карточек. Также в ядре
реализовано централизованное обращение к серверу по HTTP протоколу, а
именно:
 формирование запроса к серверу в виде JSON, включающего определение
метода, выполняемого на сервере,
а также передача параметров
выполнения метода;
 получение результата от сервера.
- 10 -
Использование ядра позволило сократить время создания форм приложения,
а также обеспечить унифицированный механизм обмена данными. Диаграмма
классов клиентской части представлена на рис.5 и рис. 6.
Рис. 4. Диаграмма классов серверной части приложения
Рис. 5. Диаграмма классов клиентской части приложения (1)
- 11 -
Рис. 6. Диаграмма классов клиентской части приложения (2)
Руководство оператора
НАЗНАЧЕНИЕ ПРОГРАММНОГО КОМПЛЕКСА
Программный комплекс «КиноАдминистратор» предназначен для
настройки администрирования сети кинотеатров.
Программный комплекс выполняет следующие функции:
 регистрация пользователей и сотрудников;
 отображение, просмотр и редактирование сведений о кинотеатрах и
залах;
 отображение, просмотр и редактирование информации о киносеансах и
фильмах;
 заказ билетов.
УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММНОГО КОМПЛЕКСА
Требования к техническим средствам
Для обеспечения функционирования ПК требуется следующая
минимальная конфигурация аппаратных средств персональной электронной
вычислительной машины:
1) системный блок персональной электронной вычислительной машины:
– процессор Intel Pentium IV и выше;
– тактовая частота процессора – 2000 МГц, не менее;
– объём оперативного запоминающего устройства – 1 Гбайт, не менее;
– объём свободного пространства на жестком диске HDD – 2 Гбайт, не
менее.
2) скорость передачи данных по сети – 1Гбит/с, не менее;
3) монитор LCD с разрешением не менее 1280×1024×24(32) Гц и
диагональю 19''.
Требования к программному обеспечению
К программному обеспечению предъявляются следующие требования:
–
операционная система (ОС) Windows XP или выше;
–
система управления базами данных MySQL 5.1 или выше;
–
интернет обозреватель Google Chrome;
–
сервер приложений Tomcat 6.0 или выше.
ВЫПОЛНЕНИЕ ПРОГРАММНОГО КОМПЛЕКСА ДЛЯ СОТРУДНИКОВ
КИНОТЕАТРА
Начало работы с программным комплексом
Для запуска ПК «КиноАдминистратор» необходимо выбрать
«Пуск->Программы->КиноАдминистратор->КиноАдминистратор».
Будет
запущено приложение, в окне которого будет отображена форма аутентификации
пользователя (Рис. 7).
Рис.7
В поле «Логин» необходимо ввести логин сотрудника, а в поле «Пароль»
его пароль. Если при аутентификации произошла ошибка, то будет выведено
сообщение (Рис. 8).
Рис.8
После успешного завершения аутентификации открывается главная форма
ПК «КиноАдминистратор» (Рис. 9).
- 14 -
Рис. 9
В верхней части окна отображается ФИО сотрудника и кинотеатр, в
котором он работает. Нижнюю часть окна занимает меню.
Работа со справочником «Сотрудники»
Для начала работы со справочником сотрудников необходимо выбрать
пункт главного меню «Сотрудники». Будет открыт справочник сотрудников
(рис.10).
Рис. 10
- 15 -
На панели инструментов доступны следующие кнопки:
«Назад» - возврат в предыдущее меню;
- «Добавить» - добавление данных;
- «Удалить» - удаление данных;
- «Информация» - подробная информация.
Справочник представляет собой таблицу, каждая строка которой является
записью о сотруднике кинотеатра.
Для добавления записи о пользователе необходимо нажать на кнопку
«Добавить». Будет открыта для заполнения карточка нового пользователя (рис. 5).
Рис. 11
В полях «Фамилия», «Имя», «Отчество», «Логин», «Пароль» и «Описание»
нужно ввести с клавиатуры данные сотрудника кинотеатра. Поле «Кинотеатр»
заполняется выбором значения из выпадающего списка, содержащего названия
кинотеатров.
Для удаления записи необходимо нажать на кнопку
«Удалить».
Для редактирования записи необходимо выделить ее в таблице и нажать на
кнопку
«Информация».
- 16 -
Аналогичным образом построена работа с остальными справочниками и
карточками.
Права доступа в ПК «КиноАдминистратор»
Все сотрудники обладают равными правами доступа. Они могут
редактировать информацию о кинотеатрах, фильмах, сеансах, пользователях и
сотрудниках.
ВЫПОЛНЕНИЕ ПРОГРАММНОГО КОМПЛЕКСА ДЛЯ ПОЛЬЗОВАТЕЛЕЙ
Начало работы с программным комплексом
Для запуска ПК для пользователей необходимо в адресной строке браузера
Google Chrome ввести строку «localhost:8080/Pepper». Будет запущено
приложение, внешний вид которого представлен на рисунке 12.
Рис. 12
Форма аутентификации пользователя находится в верхней части окна. Для
того, чтобы войти в качестве авторизованного пользователя нажмем кнопку
«Войти» (Рис. 13).
- 17 -
Рис. 13
В поле «Имя пользователя» необходимо ввести логин пользователя, а в
поле «Пароль» его пароль. Если при аутентификации произошла ошибка, то будет
выведено соответствующее сообщение.
Работа со справочником «Кинотеатров»
Для начала работы со справочником сотрудников необходимо выбрать
пункт главного меню «Список кинотеатров». Будет открыт справочник
кинотеатров (рис.14).
- 18 -
Рис 14
Права доступа
Все пользователи обладают равными правами доступа. Они могут
просматривать информацию о кинотеатрах, фильмах, сеансах. Пользователи ПК
могут заказывать билеты и редактировать информацию о себе.
КОНТРОЛЬНЫЙ ПРИМЕР
Контрольный пример по регистрации сотрудника ПК «КиноАдминистратор»
Для регистрации сотрудника ПК «КиноАдминистратор» необходимо
выполнить следующие действия:
1) Запустить ПК
«КиноАдминистратор»
– отображена форма
аутентификации.
- 19 -
2) В поле «Логин» ввести значение misha, в поле «Пароль» ввести значение
239, нажать на кнопку «Вход» – выполнена аутентификация, открыта стартовая
страница ПК «КиноАдминистратор» и отображено главное меню.
3) В главном меню наддать на кнопку «Сотрудники», откроется список
сотрудников.
4) На панели инструментов нажать на кнопку
«Добавить», откроется
карточка сотрудника.
5) В поле «Фамилия» ввести «Петров», в поле «Имя» ввести «Петр», в поле
«Отчество» ввести «Петрович», в поле «Логин» ввести «petr», в поле «Пароль»
ввести «123», в поле «Кинотеатр» выбрать «KinoStar», в поле «Описание» ввести
«Тестовый сотрудник».
6) На панели управления карточки сотрудника нажать на кнопку
«Сохранить» – карточка сотрудника сохранена, снова откроется форма со
списком сотрудников.
7) Выбрать в меню пункт «Выйти».
8) Снова запустить ПК «КиноАдминистратор» в поле «Логин» ввести
«petr», в поле «Пароль» ввести «123», нажать на кнопку «Вход» – выполнена
аутентификация, открыта стартовая страница ПК «КиноАдминистратор»; в
верхней части страницы ПК отображены фамилия, имя и отчество текущего
пользователя – «Петров Петр Петрович», а также название кинотеатра, в котором
он работает.
Контрольный пример по регистрации пользователя ПК
Для регистрации пользователя ПК необходимо выполнить следующие
действия:
1) Запустить ПК, нажать кнопку «Войти»
– отображена форма
аутентификации.
2) В правой части формы аутентификации в поле «Имя пользователя»
ввести значение «test», в поле «Пароль» ввести значение «123», в поле «Пароль
ещё раз» ввести снова «123» и нажать на кнопку «Зарегистрироваться» –
выполнена регистрация нового пользователя, открыта окно, сообщающее об
успешной регистрации пользователя.
3) В форме аутентификации в поле «Имя пользователя» ввести значение
«test», в поле «Пароль» ввести значение «123» и нажать на кнопку «Войти», на
экран будет выведено сообщение о том, что вход выполнен.
- 20 -
СООБЩЕНИЯ ОПЕРАТОРУ
Сообщения оператору подразделяются на:
– информационные сообщения;
– предупреждающие сообщения;
– сообщения об ошибках.
Информационные сообщения предназначены для информирования
оператора о действиях ПК.
Предупреждающие сообщения предназначены для предупреждения
оператора о неверных действиях, необходимости концентрации внимания, а
также для
информирования о необходимости выполнения определенных
действий.
Сообщения об ошибках предназначены для информирования оператора о
невозможности выполнения программой тех или иных операций.
Для вывода сообщений используются модальные окна сообщений ОС
Windows.
Сообщения, выводимые в процессе работы, приведены таблице:
Заголовок
сообщения
«Внимание!»
Описание
Действия
сообщения
Оператора
«Неверный логин или Выдается
при Нажать на кнопку
пароль!»
возникновении
«ОК»
ошибки во время
аутентификации
Тело сообщения
- 21 -
Руководство программиста
ИНСТАЛЛЯЦИЯ ПРОГРАММНОГО КОМПЛЕКСА
Запуск процесса установки и выбор варианта установки программного комплекса
Перед развертыванием ПК должны быть выполнены установки СУБД
MySQL, а также сервере приложений Apache Tomcat.
Дистрибутив ПК состоит из двух частей:
–
дистрибутив приложения;
–
дистрибутив с первоначальным наполнением базы данных;
Процесс установки дистрибутивов описан в разделах «Установка
приложения»
Загрузка содержимого базы данных
Загрузка первоначального наполнения базы данных, необходимого для
запуска ПК осуществляется средствами СУБД MySQL. Данные для загрузки
находятся в соответствующем дистрибутиве.
Установка приложения
Для установки приложения необходимо запустить мастер установки с
помощью файла KinoAdminSetup.exe. Далее необходимо указать путь к папке, в
которую будет установлено клиентское приложение (рис.15).
Рис 15
- 22 -
В следующей форме мастера установки требуется указать название и порт
сервера приложений, на котором будет установлена серверная часть ПК (рис 16).
Рис 16
Для настройки серверной части ПК необходимо указать путь к папке, в
которую установлен Apache Tomcat, задать адрес сервера базы данных, а также
логин и пароль для доступа к базе данных (рис 17.).
Рис 17
- 23 -
Входные и выходные данные
Входными данными ПК являются:
 данные о сотрудниках;
 данные об интерет-пользователях;
 данные о кинотеатрах;
 данные о фильмах;
 данные о сеансах;
 данные о заказанных билетах.
Выходными данными ПК являются:
 перечень сотрудников и интернет-пользователей;
 перечень кинотеатров и залов в них;
 перечень фильмов;
 перечень сеансов и информация о заказанных билетах
- 24 -
Выводы
В результате выполнения курсовой работы был выполнен анализ предметной
области задачи. По результатам анализа была спроектирована база данных.
На основе поставленных задач была выбрана трехзвенная архитектура
приложения. Для кодирования программного комплекса использовался объектноориентированный язык Java.
- 25 -
Приложение 1. Текст программы
com.study.pepper.client.utils.ServerManager
public class ServerManager {
private static final ServerManager INSTANCE = new ServerManager();
private ServerManager() {}
public static synchronized ServerManager getInstance() {
return INSTANCE;
}
private String executeRequest(String json)
{
try
{
String result = post(json);
return result;
}
catch(Exception ex)
{
ex.printStackTrace();
System.err.println("Ошибка!!");
return null;
}
}
private String post(String json) throws Exception
{
byte[] bRequest;
byte[] buffer;
int len;
URL servlet;
StringBuffer headerbuf;
Socket socket;
BufferedOutputStream outBuffer;
bRequest = json.getBytes();
servlet = new URL("http://" + MainProperties.getProperty("server.host") +
":" + MainProperties.getProperty("server.port")+ "/Pepper/client");
headerbuf = new StringBuffer();
headerbuf.append("POST ").append(servlet.getFile())
.append(" HTTP/1.0\r\n")
.append("Host: ").append(servlet.getHost()).append("\r\n")
.append("Content-Length: ").append(bRequest.length).append("\r\n\r\n");
socket = new Socket(servlet.getHost(), servlet.getPort());
outBuffer = new BufferedOutputStream(socket.getOutputStream());
outBuffer.write(headerbuf.toString().getBytes());
outBuffer.write(bRequest);
outBuffer.flush();
socket.getOutputStream().flush();
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
ByteArrayOutputStream resultBuf = new ByteArrayOutputStream();
buffer = new byte[1024];
- 26 -
while((len = socket.getInputStream().read(buffer)) > 0)
resultBuf.write(buffer, 0, len);
os.close();
is.close();
resultBuf.close();
String temp = resultBuf.toString();
int pos = temp.indexOf("\r\n\r\n");
return temp.substring(pos+4);
}
private String createSelectRequest(RequestEnum operation) {
JSONObject params = new JSONObject();
params = new JSONObject();
params.put("size", 0);
return createRequest(operation, params);
}
private String createSelectRequest(RequestEnum operation, JSONObject params)
{
return createRequest(operation, params);
}
private String createUpdateRequest(RequestEnum operation, JSONObject params)
{
params.put("size", params.length());
return createRequest(operation, params);
}
private String createRemoveRequest(RequestEnum operation, JSONArray params)
{
JSONObject json = new JSONObject();
json.put("operation", operation.getMethodName());
json.put("params", params);
return json.toString();
}
private String createRequest(RequestEnum operation, JSONObject params) {
JSONObject json = new JSONObject();
json.put("operation", operation.getMethodName());
json.put("params", params);
return json.toString();
}
/* Запросы */
public String getCinemasList() {
String request = createSelectRequest(RequestEnum.CINEMAS_LIST);
return executeRequest(request);
}
public String updateCinema(JSONObject json) {
String request = createUpdateRequest(RequestEnum.CINEMAS_UPDATE,
json);
return executeRequest(request);
}
public String getFilmsList() {
String request = createSelectRequest(RequestEnum.FILMS_LIST);
return executeRequest(request);
}
public String updateFilm(JSONObject json) {
- 27 -
String request = createUpdateRequest(RequestEnum.FILMS_UPDATE, json);
return executeRequest(request);
}
public String removeFilm(JSONArray json) {
String request = createRemoveRequest(RequestEnum.FILMS_REMOVE, json);
return executeRequest(request);
}
public String removeCinema(JSONArray json) {
String request = createRemoveRequest(RequestEnum.CINEMAS_REMOVE,
json);
return executeRequest(request);
}
public String removeHall(JSONArray json) {
String request = createRemoveRequest(RequestEnum.HALLS_REMOVE, json);
return executeRequest(request);
}
public String getHallsList(int cinemaId) {
String id = String.valueOf(cinemaId);
String src = "{\"cinemaid\":" + id + "}";
JSONObject param = new JSONObject(src);
String request = createSelectRequest(RequestEnum.HALLS_LIST, param);
return executeRequest(request);
}
public String removePlace(JSONArray json) {
String request = createRemoveRequest(RequestEnum.PLACES_REMOVE, json);
return executeRequest(request);
}
public String getPlaceList(int hallId) {
String idh = String.valueOf(hallId);
String src = "{\"hallid\":" + idh + "}";
JSONObject param = new JSONObject(src);
String request = createSelectRequest(RequestEnum.PLACES_LIST, param);
return executeRequest(request);
}
public String updateHall(JSONObject json, int cinemaId) {
json.put("cinemaId", cinemaId);
String id = String.valueOf(cinemaId);
String src = "{\"cinemaid\":" + id + "}";
JSONObject param = new JSONObject(src);
String request = createUpdateRequest(RequestEnum.HALLS_UPDATE, json);
return executeRequest(request);
}
public String updateHall(JSONObject json, int cinemaId, int row, int col) {
json.put("cinemaId", cinemaId);
json.put("row", row);
json.put("col", col);
String request = createUpdateRequest(RequestEnum.HALLS_UPDATE, json);
return executeRequest(request);
}
public String getMembersList() {
String request = createSelectRequest(RequestEnum.MEMBERS_LIST);
return executeRequest(request);
}
public String updateMember(JSONObject json) {
- 28 -
String request = createUpdateRequest(RequestEnum.MEMBERS_UPDATE,
json);
return executeRequest(request);
}
public String removeMember(JSONArray json) {
String request = createRemoveRequest(RequestEnum.MEMBERS_REMOVE,
json);
return executeRequest(request);
}
public String getEmployeesList() {
String request = createSelectRequest(RequestEnum.EMPLOYEES_LIST);
return executeRequest(request);
}
public String updateEmployee(JSONObject json) {
String request = createUpdateRequest(RequestEnum.EMPLOYEES_UPDATE,
json);
return executeRequest(request);
}
public String removeEmployee(JSONArray json) {
String request = createRemoveRequest(RequestEnum.EMPLOYEES_REMOVE,
json);
return executeRequest(request);
}
public String getSessionsList(String date) {
JSONObject param = new JSONObject();
if (!date.isEmpty())
{
param.put("date", new Date());
}
String request = createSelectRequest(RequestEnum.SESSIONS_LIST,
param);
return executeRequest(request);
}
public String updateSession(JSONObject json) {
String request = createUpdateRequest(RequestEnum.SESSIONS_UPDATE,
json);
return executeRequest(request);
}
public String removeSession(JSONArray json) {
String request = createRemoveRequest(RequestEnum.SESSIONS_REMOVE,
json);
return executeRequest(request);
}
public String getNotFreePlaseList(JSONObject json){
String request = createSelectRequest(RequestEnum.NOTFREEPLACE_LIST,
json);
return executeRequest(request);
}
public String updateZakaz(JSONObject json) {
String request = createUpdateRequest(RequestEnum.ZAKAZ_UPDATE, json);
return executeRequest(request);
}
- 29 -
public String removeZakaz(JSONArray json) {
String request = createRemoveRequest(RequestEnum.ZAKAZ_REMOVE, json);
return executeRequest(request);
}
public String checkUser(String login, String md5) {
JSONObject json = new JSONObject();
json.put("login", login);
json.put("password", md5);
String request = createUpdateRequest(RequestEnum.PASSWORD_LIST, json);
return executeRequest(request);
}
public String getZakazList() {
String request = createSelectRequest(RequestEnum.ZAKAZ_LIST);
return executeRequest(request);
}
}
com.study.pepper.server.thin.SessionsBean
public class SessionsBean extends BasicService{
public String getSessions() throws ParseException {
JSONArray jsArray = new JSONArray(new
ClientBean().getSessionsList(null));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < jsArray.size(); i++) {
JSONObject json = jsArray.getJSONObject(i);
String date = json.getString("date");
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
if (new Date().after(sdf.parse(date)))
continue;
String row =
"<tr> \n" +
" <td><a href=\"zakaz.jsp?id="+json.getInt("id")+"\">"+date+"<a></td>
\n" +
" <td style=\"padding-left:
200px\">"+json.getString("tofilm.name")+"</td> \n" +
" <td style=\"padding-left:
200px\">"+json.getString("tohall.name")+"</td> \n" +
" <td style=\"padding-left:
200px\">"+json.getString("cinemaname")+"</td> \n" +
"</tr>\n\n";
sb.append(row);
}
return toHTTPString(sb);
}
public String getZakazTitle(HttpServletRequest request) {
String id = request.getParameter("id");
if (id == null || id.isEmpty())
return "";
- 30 -
try {
Integer.parseInt(id);
} catch (Exception e) {
return "";
}
StringBuffer sb = new StringBuffer();
Session session =
DataObjectUtils.objectForPK(DataContext.createDataContext(), Session.class,
Long.valueOf(id));
if (session == null)
return "";
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
sb.append("<b>"+sdf.format(session.getDate())+" ,</b>&nbsp
"+session.getToFilm().getName()+", &nbsp "+session.getToHall().getName()+", &nbsp
"+session.getCinemaName()+"\n");
return toHTTPString(sb);
}
public String getZakazPlaces(HttpServletRequest request) {
String id = request.getParameter("id");
if (id == null || id.isEmpty())
return "";
try {
Integer.parseInt(id);
} catch (Exception e) {
return "";
}
StringBuffer sb = new StringBuffer();
Session session =
DataObjectUtils.objectForPK(DataContext.createDataContext(), Session.class,
Long.valueOf(id));
if (session == null)
return "";
Hall hall = session.getToHall();
int rows = hall.getRowCount();
int cols = hall.getColCount();
System.out.println("rows:" + rows);
System.out.println("cols:" + cols);
sb.append("<table style=\"font-size: 26px; font-family: Times New
Roman\">");
sb.append("<tbody><tr> \n");
sb.append("<th style=\"padding-left: 10px\">&nbsp</th>");
for (int i = 1; i <= cols; i++) {
sb.append("<th style=\"padding-left: 20px\">"+i+"</th> \n");
}
sb.append("</tr>\n"+
"<tr/>\n");
for (int i = 1; i <= rows; i++) {
sb.append("<tr>\n<td>Ряд "+i+"</td>\n");
for (int j = 1; j <= cols; j++) {
boolean free = hall.getCurrentPlace(i, j).isFree();
String img = free ? "green.png" : "red.png";
String title = free ? "Ряд "+i+" Место "+j+"" : "Место занято";
String onClick = free ? "onCLick='reserve("+id+","+i+","+j+")'"
: "";
- 31 -
sb.append("<td style=\"padding-left: 20px\"><img width=\"50\"
src='images/"+img+"' title='"+title+"' "+onClick+"/></td>\n");
}
sb.append("</tr>\n");
}
sb.append("</tbody></table> \n");
return htmltoString(sb.toString());
}
public String book(HttpServletRequest request) {
ObjectContext context = DataContext.createDataContext();
if (request.getSession().getAttribute("user") == null)
return "YOU ARE NOT LOGGED IN!";
Customer customer0 = (Customer)
request.getSession().getAttribute("user");
Customer customer = DataObjectUtils.objectForPK(context,
Customer.class, DataObjectUtils.pkForObject(customer0));
String id = request.getParameter("id");
if (id == null || id.isEmpty())
return "";
String row = request.getParameter("r");
if (row == null || row.isEmpty())
return "";
String col = request.getParameter("c");
if (col == null || col.isEmpty())
return "";
try {
Integer.parseInt(id);
Integer.parseInt(row);
Integer.parseInt(col);
} catch (Exception e) {
return "";
}
Session session = DataObjectUtils.objectForPK(context, Session.class,
Long.valueOf(id));
if (session == null)
return "";
Hall hall = session.getToHall();
Zakaz zakaz = context.newObject(Zakaz.class);
zakaz.setDatereserve(new Date());
zakaz.setToCustomer(customer);
zakaz.setToPlace(hall.getCurrentPlace(Integer.parseInt(row),
Integer.parseInt(col)));
zakaz.setDeleted(false);
try {
context.commitChanges();
}
catch (Exception e) {
e.printStackTrace();
}
String pkForObject =
String.valueOf(DataObjectUtils.longPKForObject(zakaz));
zakaz.setUniqnumber(pkForObject);
context.commitChanges();
- 32 -
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
String result = new String(
"<div style=\"padding-top: 50px; padding-left: 50px; fontsize: 18px; font-family: Times New Roman\"> \n" +
"<b>"+zakaz.getUniqnumber()+"<b> <br>\n" +
sdf.format(session.getDate())+"<br>\n" +
session.getToFilm().getName()+"<br>\n" +
session.getCinemaName()+"<br>\n" +
hall.getName()+"<br>\n" +
"("+col+"|"+row+")<br>\n" +
"</div>\n");
return toHTTPString(result);
}
}
com.study.pepper.client.ui.basic.BasicCard
public abstract class BasicCard extends JInternalFrame{
private JPanel panel;
protected
protected
protected
protected
int
int
int
int
topOffset = 50;
leftOffset = 10;
lblOffset = 5;
tfHeight = 22;
protected JSONObject data;
private AbstractCallback callback;
private FormField[] fields;
public BasicCard(String title, JSONObject data, JDesktopPane desktopParent,
AbstractCallback callback)
{
super(title);
this.data = data;
this.callback = callback;
init(desktopParent);
initToolBar();
initCard();
loadData();
initAfterLoad();
}
private void init(JDesktopPane desktopParent)
{
setClosable(true);
setIconifiable(false);
setResizable(false);
setVisible(true);
setMaximizable(false);
desktopParent.add(this);
try
{
setSelected(true);
setMaximum(true);
}
catch(Exception ex)
{
ex.printStackTrace();
}
JDesktopPane desktop = new JDesktopPane();
- 33 -
setContentPane(desktop);
panel = new JPanel();
panel.setLayout(null);
panel.setBounds(0,0,getWidth()-10,getHeight()-35);
desktop.add(panel);
}
private void initToolBar()
{
JToolBar toolbar = new JToolBar();
toolbar.setFloatable(false);
JButton btBack = Utils.createToolbarButton("back",null,"Закрыть", new
ImageIcon(Utils.BACK_BUTTON), new ImageIcon(Utils.BACK_BUTTON_OVER));
toolbar.add(btBack);
btBack.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
close();
}
});
JButton btSaveClose =
Utils.createToolbarButton("saveclose",null,"Сохранить и закрыть", new
ImageIcon(Utils.SAVE_CLOSE_BUTTON), new ImageIcon(Utils.SAVE_CLOSE_BUTTON_OVER));
toolbar.add(btSaveClose);
btSaveClose.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
saveClose();
}
});
toolbar.setBounds(0,0,panel.getWidth(),topOffset);
panel.add(toolbar);
}
protected void initCard() {
initFields();
panel.add(createFormPanel());
}
private void close()
{
dispose();
}
protected abstract void initFields();
protected abstract JPanel createFormPanel();
protected abstract void update(JSONObject data);
protected void initAfterLoad()
{
}
public void setFormFields(FormField[] fields) {
this.fields = fields;
}
private void saveClose() {
if (!validateFields())
{
- 34 -
Utils.showWarningMessage("Содержимое одного из полей не может
быть сохранено!");
return;
}
if (!validateBeforeSave()) {
Utils.showWarningMessage("Запись не может быть сохранена!");
return;
}
storeData();
update(data);
callback.onSuccess(null); // пока null, т.к. всегда обновление таблицы
close();
}
private boolean validateFields() {
for (FormField field: fields) {
if (!field.validateField())
return false;
}
return true;
}
protected boolean validateBeforeSave(){
return true;
}
private void loadData() {
if (data == null)
{
loadCombo();
return;
}
for (FormField field: fields) {
String property = field.getProperty();
Object value = data.get(property);
if (field instanceof FormTextField) {
((JTextField)field).setText(String.valueOf(value));
}
else if (field instanceof FormDateField) {
((JFormattedTextField)field).setText(String.valueOf(value));
}
else if (field instanceof FormComboBox) {
((FormComboBox)field).setModel(new
CinemaComboBoxModel(((FormComboBox)field).getList()));
if (data.getJSONObject(property)!= null &&
data.getJSONObject(property).getString("name") != null &&
!(data.getJSONObject(property).getString("name").isEmpty()))
((FormComboBox)field).getModel().setSelectedItem(data.getJSONObject(property
).getString("name"));
}
}
}
private void loadCombo()
{
for (FormField field: fields) {
if (field instanceof FormComboBox) {
- 35 -
((FormComboBox)field).setModel(new
CinemaComboBoxModel(((FormComboBox)field).getList()));
}
}
}
private void storeData()
{
if (data == null)
data = new JSONObject();
for (FormField field: fields) {
String property = field.getProperty();
Object value = null;
if (field instanceof FormTextField) {
value = ((JTextField)field).getText();
}
else if (field instanceof FormPasswordField) {
value = UtilsMD5.code("f5g" +
((JPasswordField)field).getText() + "65gf");
}
/*else if (field instanceof FormComboBox) {
value =
((CinemaComboBoxModel)((FormComboBox)field).getModel()).getSelectedItemId();
}*/
else if (field instanceof FormDateField) {
value = ((JFormattedTextField)field).getText();
}
if (FormFieldType.INTEGER.equals(field.getType()))
try {
value = Integer.parseInt(String.valueOf(value));
}
catch (Exception e) {}
data.put(property, value);
}
}
}
com.study.pepper.client.ui.basic.BasicList
public abstract class BasicList extends JInternalFrame{
protected JPanel panel;
protected int topOffset = 50;
protected int leftOffset = 10;
JTable table;
Vector<String> columnNames;
ColumnConfigurator columnsConfigurator;
JSONArray data;
protected JToolBar toolbar;
public BasicList(String title, JDesktopPane desktopParent) {
super(title);
init(desktopParent);
initToolBar();
initTable();
- 36 -
}
public BasicList(String title, JDesktopPane desktopParent, int param) {
super(title);
initParam(param);
init(desktopParent);
initToolBar();
initTable();
}
protected void initParam(int p) {
}
/*public BasicList(String title, JDesktopPane desktopParent, int id) {
super(title);
init(desktopParent);
initToolBar();
initTable(id);
}*/
private void init(JDesktopPane desktopParent)
{
setClosable(true);
setIconifiable(false);
setResizable(false);
setVisible(true);
setMaximizable(false);
desktopParent.add(this);
try
{
setSelected(true);
setMaximum(true);
}
catch(Exception ex)
{
ex.printStackTrace();
}
JDesktopPane desktop = new JDesktopPane();
setContentPane(desktop);
panel = new JPanel();
panel.setLayout(null);
panel.setBounds(0,0,getWidth()-10,getHeight()-35);
desktop.add(panel);
}
protected void initToolBar()
{
toolbar = new JToolBar("toolbar");
toolbar.setFloatable(false);
addCloseButton();
toolbar.addSeparator();
toolbar.addSeparator();
addViewButton();
toolbar.addSeparator();
addAddButton();
addRemoveButton();
toolbar.addSeparator();
addArchiveButton();
toolbar.setBounds(leftOffset,0,panel.getWidth(),topOffset);
- 37 -
panel.add(toolbar);
}
protected void addArchiveButton() {
}
protected void addRemoveButton() {
JButton btDelete = Utils.createToolbarButton("delete",null,"Удалить",
new ImageIcon(Utils.DELETE_BUTTON),new ImageIcon(Utils.DELETE_BUTTON_OVER));
toolbar.add(btDelete);
btDelete.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
int[] index = table.getSelectedRows();
if (index.length == 0)
{
Utils.showInformationMessage("Необходимо
выбрать строку в таблице!");
return;
}
JSONArray json = new JSONArray();
for (int i = 0; i < index.length; i++) {
json.add(data.getJSONObject(index[i]));
}
removeRow(json, new DeleteCallback());
onDeleteSuccess();
}
});
}
protected void addAddButton() {
JButton btAdd = Utils.createToolbarButton("add",null,"Добавить", new
ImageIcon(Utils.ADD_BUTTON),new ImageIcon(Utils.ADD_BUTTON_OVER));
toolbar.add(btAdd);
btAdd.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
addRow(new AddCallback());
}
});
}
protected void addViewButton() {
JButton btView =
Utils.createToolbarButton("view",null,"Редактировать", new
ImageIcon(Utils.VIEW_BUTTON),new ImageIcon(Utils.VIEW_BUTTON_OVER));
toolbar.add(btView);
btView.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
int[] index = table.getSelectedRows();
if (index.length != 1)
{
JOptionPane.showOptionDialog(null, "Необходимо
выбрать строку в таблице!", "Внимание",
JOptionPane.CLOSED_OPTION,
JOptionPane.INFORMATION_MESSAGE,
null, null, null);
return;
}
JSONObject row = data.getJSONObject(index[0]);
editRow(row, new EditCallback());
- 38 -
}
});
}
protected void addCloseButton() {
JButton btBack = Utils.createToolbarButton("back",null,"Назад", new
ImageIcon(Utils.BACK_BUTTON),new ImageIcon(Utils.BACK_BUTTON_OVER));
toolbar.add(btBack);
btBack.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
close();
}
});
}
private void initTable()
{
ColumnConfig[] columns = getColumnsConfig();
columnsConfigurator = new ColumnConfigurator(columns);
columnNames = new Vector<String>(columns.length);
for (int i = 0; i < columns.length; i++) {
columnNames.add(columns[i].getName());
}
table = new JTable(new Vector<Object>(),columnNames){
public boolean isCellEditable(int rowIndex, int colIndex) {
return false;
}
};
setColumnWidths();
loadData();
JScrollPane scroll = new JScrollPane(table);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
scroll.setBounds(leftOffset,topOffset, panel.getWidth()-2*leftOffset,
panel.getHeight()-topOffset-leftOffset);
panel.add(scroll);
}
private void setColumnWidths() {
int columnCount = table.getColumnCount();
for (int i = 0; i < columnCount; i++) {
String columnName = table.getColumnName(i);
int columnWidth =
columnsConfigurator.getMappingWidth().get(columnName);
table.getColumn(columnName).setPreferredWidth(columnWidth);
}
}
protected void close()
{
dispose();
}
private DefaultTableModel getDefTableModel() {
return (DefaultTableModel) table.getModel();
}
- 39 -
/**
*
*/
protected void loadData() {
int rowCount = getDefTableModel().getRowCount();
if (rowCount != 0) {
for (int i = 0; i < rowCount; i++) {
getDefTableModel().removeRow(0);
}
}
data = fetchData();
for (int i = 0; i < data.size(); i++) {
JSONObject row = data.getJSONObject(i);
//сетим данные в колонки
Object[] rowValues = new
Object[getDefTableModel().getColumnCount()];
for (int j = 0; j < getDefTableModel().getColumnCount(); j++) {
String fieldName =
columnsConfigurator.getMappingFields().get(getDefTableModel().getColumnName(j));
if (!row.has(fieldName)) {
System.err.println("JSONArray не содержит поля: " +
fieldName);
}
rowValues[j] = row.get(fieldName);
}
getDefTableModel().addRow(rowValues);
}
}
/* ******************************************************** */
protected abstract JSONArray fetchData();
protected abstract ColumnConfig[] getColumnsConfig();
protected abstract void addRow(AddCallback callback);
protected abstract void editRow(JSONObject row, EditCallback callback);
protected abstract void removeRow(JSONArray json, DeleteCallback
deleteCallback);
/* ******************************************************** */
protected void onAddSuccess(JSONObject result) {
loadData();
}
protected void onEditSuccess(JSONObject result) {
loadData();
}
protected void onDeleteSuccess() {
loadData();
}
/* ******************************************************** */
protected class ColumnConfig {
- 40 -
private String name;
private String field;
private int width;
public ColumnConfig(String name, String field, int width) {
this.name = name;
this.field = field;
this.width = width;
}
/**
* Возвращает
* @return the name
*/
public String getName() {
return name;
}
/**
* Возвращает
* @return the field
*/
public String getField() {
return field;
}
/**
* Возвращает
* @return the width
*/
public int getWidth() {
return width;
}
}
private class ColumnConfigurator {
private HashMap<String, String> mappingFields;
private HashMap<String, Integer> mappingWidths;
public ColumnConfigurator(ColumnConfig[] columns) {
mappingFields = new HashMap<String, String>(columns.length);
mappingWidths = new HashMap<String, Integer>(columns.length);
for (ColumnConfig columnConfig : columns) {
if (mappingFields.put(columnConfig.getName(),
columnConfig.getField()) != null)
System.err.println("Duplicate Column Names!");
mappingWidths.put(columnConfig.getName(),
columnConfig.getWidth());
}
}
/**
* Возвращает
* @return the mappingFields
*/
public HashMap<String, String> getMappingFields() {
return mappingFields;
}
/**
* Возвращает
- 41 -
* @return the mappingWidths
*/
public HashMap<String, Integer> getMappingWidth() {
return mappingWidths;
}
}
protected class AddCallback implements AbstractCallback {
public void onSuccess(JSONObject result) {
onAddSuccess(result);
}
}
protected class EditCallback implements AbstractCallback {
public void onSuccess(JSONObject result) {
onEditSuccess(result);
}
}
protected class DeleteCallback implements AbstractCallback {
public void onSuccess(JSONObject result) {
onDeleteSuccess();
}
}
}
com.study.pepper.client.utils.ServerManager.ServerManager()
public class ServerManager {
private static final ServerManager INSTANCE = new ServerManager();
private ServerManager() {}
public static synchronized ServerManager getInstance() {
return INSTANCE;
}
private String executeRequest(String json)
{
try
{
String result = post(json);
return result;
}
catch(Exception ex)
{
ex.printStackTrace();
System.err.println("Ошибка!!");
return null;
}
}
private String post(String json) throws Exception
{
byte[] bRequest;
byte[] buffer;
int len;
URL servlet;
StringBuffer headerbuf;
Socket socket;
BufferedOutputStream outBuffer;
- 42 -
bRequest = json.getBytes();
servlet = new URL("http://" + MainProperties.getProperty("server.host") +
":" + MainProperties.getProperty("server.port")+ "/Pepper/client");
headerbuf = new StringBuffer();
headerbuf.append("POST ").append(servlet.getFile())
.append(" HTTP/1.0\r\n")
.append("Host: ").append(servlet.getHost()).append("\r\n")
.append("Content-Length: ").append(bRequest.length).append("\r\n\r\n");
socket = new Socket(servlet.getHost(), servlet.getPort());
outBuffer = new BufferedOutputStream(socket.getOutputStream());
outBuffer.write(headerbuf.toString().getBytes());
outBuffer.write(bRequest);
outBuffer.flush();
socket.getOutputStream().flush();
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
ByteArrayOutputStream resultBuf = new ByteArrayOutputStream();
buffer = new byte[1024];
while((len = socket.getInputStream().read(buffer)) > 0)
resultBuf.write(buffer, 0, len);
os.close();
is.close();
resultBuf.close();
String temp = resultBuf.toString();
int pos = temp.indexOf("\r\n\r\n");
return temp.substring(pos+4);
}
private String createSelectRequest(RequestEnum operation) {
JSONObject params = new JSONObject();
params = new JSONObject();
params.put("size", 0);
return createRequest(operation, params);
}
private String createSelectRequest(RequestEnum operation, JSONObject params)
{
return createRequest(operation, params);
}
private String createUpdateRequest(RequestEnum operation, JSONObject params)
{
params.put("size", params.length());
return createRequest(operation, params);
}
private String createRemoveRequest(RequestEnum operation, JSONArray params)
{
JSONObject json = new JSONObject();
json.put("operation", operation.getMethodName());
json.put("params", params);
return json.toString();
}
private String createRequest(RequestEnum operation, JSONObject params) {
JSONObject json = new JSONObject();
- 43 -
json.put("operation", operation.getMethodName());
json.put("params", params);
return json.toString();
}
/* Запросы */
public String getCinemasList() {
String request = createSelectRequest(RequestEnum.CINEMAS_LIST);
return executeRequest(request);
}
public String updateCinema(JSONObject json) {
String request = createUpdateRequest(RequestEnum.CINEMAS_UPDATE,
json);
return executeRequest(request);
}
public String getFilmsList() {
String request = createSelectRequest(RequestEnum.FILMS_LIST);
return executeRequest(request);
}
public String updateFilm(JSONObject json) {
String request = createUpdateRequest(RequestEnum.FILMS_UPDATE, json);
return executeRequest(request);
}
public String removeFilm(JSONArray json) {
String request = createRemoveRequest(RequestEnum.FILMS_REMOVE, json);
return executeRequest(request);
}
public String removeCinema(JSONArray json) {
String request = createRemoveRequest(RequestEnum.CINEMAS_REMOVE,
json);
return executeRequest(request);
}
public String removeHall(JSONArray json) {
String request = createRemoveRequest(RequestEnum.HALLS_REMOVE, json);
return executeRequest(request);
}
public String getHallsList(int cinemaId) {
String id = String.valueOf(cinemaId);
String src = "{\"cinemaid\":" + id + "}";
JSONObject param = new JSONObject(src);
String request = createSelectRequest(RequestEnum.HALLS_LIST, param);
return executeRequest(request);
}
public String removePlace(JSONArray json) {
String request = createRemoveRequest(RequestEnum.PLACES_REMOVE, json);
return executeRequest(request);
}
public String getPlaceList(int hallId) {
String idh = String.valueOf(hallId);
String src = "{\"hallid\":" + idh + "}";
JSONObject param = new JSONObject(src);
String request = createSelectRequest(RequestEnum.PLACES_LIST, param);
return executeRequest(request);
}
- 44 -
public String updateHall(JSONObject json, int cinemaId) {
json.put("cinemaId", cinemaId);
String id = String.valueOf(cinemaId);
String src = "{\"cinemaid\":" + id + "}";
JSONObject param = new JSONObject(src);
String request = createUpdateRequest(RequestEnum.HALLS_UPDATE, json);
return executeRequest(request);
}
public String updateHall(JSONObject json, int cinemaId, int row, int col) {
json.put("cinemaId", cinemaId);
json.put("row", row);
json.put("col", col);
String request = createUpdateRequest(RequestEnum.HALLS_UPDATE, json);
return executeRequest(request);
}
public String getMembersList() {
String request = createSelectRequest(RequestEnum.MEMBERS_LIST);
return executeRequest(request);
}
public String updateMember(JSONObject json) {
String request = createUpdateRequest(RequestEnum.MEMBERS_UPDATE,
json);
return executeRequest(request);
}
public String removeMember(JSONArray json) {
String request = createRemoveRequest(RequestEnum.MEMBERS_REMOVE,
json);
return executeRequest(request);
}
public String getEmployeesList() {
String request = createSelectRequest(RequestEnum.EMPLOYEES_LIST);
return executeRequest(request);
}
public String updateEmployee(JSONObject json) {
String request = createUpdateRequest(RequestEnum.EMPLOYEES_UPDATE,
json);
return executeRequest(request);
}
public String removeEmployee(JSONArray json) {
String request = createRemoveRequest(RequestEnum.EMPLOYEES_REMOVE,
json);
return executeRequest(request);
}
public String getSessionsList(String date) {
JSONObject param = new JSONObject();
if (!date.isEmpty())
{
param.put("date", new Date());
}
String request = createSelectRequest(RequestEnum.SESSIONS_LIST,
param);
return executeRequest(request);
}
- 45 -
public String updateSession(JSONObject json) {
String request = createUpdateRequest(RequestEnum.SESSIONS_UPDATE,
json);
return executeRequest(request);
}
public String removeSession(JSONArray json) {
String request = createRemoveRequest(RequestEnum.SESSIONS_REMOVE,
json);
return executeRequest(request);
}
public String getNotFreePlaseList(JSONObject json){
String request = createSelectRequest(RequestEnum.NOTFREEPLACE_LIST,
json);
return executeRequest(request);
}
public String updateZakaz(JSONObject json) {
String request = createUpdateRequest(RequestEnum.ZAKAZ_UPDATE, json);
return executeRequest(request);
}
public String removeZakaz(JSONArray json) {
String request = createRemoveRequest(RequestEnum.ZAKAZ_REMOVE, json);
return executeRequest(request);
}
public String checkUser(String login, String md5) {
JSONObject json = new JSONObject();
json.put("login", login);
json.put("password", md5);
String request = createUpdateRequest(RequestEnum.PASSWORD_LIST, json);
return executeRequest(request);
}
public String getZakazList() {
String request = createSelectRequest(RequestEnum.ZAKAZ_LIST);
return executeRequest(request);
}
}
- 46 -
Приложение 2. Ссылка на электронный ресурс
Материалы по данной работе размещены в сети интернет по адресу:
http://code.google.com/p/cinemas-admin/
- 47 -
Download