анализ предметной области информационной системы

Описание:
Доступные действия
Введите защитный код для скачивания файла и нажмите "Скачать файл"
Защитный код
Введите защитный код

Нажмите на изображение для генерации защитного кода

Текст:

Оглавление

Введение. 2

1.      Постановка задачи и анализ предметной области информационной системы... 3

1.1 Постановка задачи и анализ предметной области. 3

1.2        Моделирование бизнес процессов приложения. 6

1.3        Построение исходной концептуальной модели предметной области. 8

2       Проектирование приложения.. 9

2.1        Информационные потребности пользователя приложения. 9

2.2        Технические требования и ограничения на разработку приложения. 9

2.3        Логическое проектирование. 11

3       Разработка приложения.. 11

3.1        Физическое моделирование. 11

3.2        Разработка MVC модели.. 11

4       Тестирование приложения.. 19

Заключение. 20

Список используемой литературы... 21

Приложение. 22

Введение.

В последние годы на первый план выдвигается новая отрасль - информационная индустрия, связанная с производством технических средств, методов, технологий для производства новых знаний. Эта индустрия тесно связана с развитием компьютерных технологий.

Изменятся весь уклад жизни, система ценностей: возрастает значимость культурного досуга, возрастает спрос на знания, от человека требуется способность к интеллектуальному труду и творчеству.

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

Реляционная СУБД (Система Управления Базами Данных) - СУБД, управляющая реляционными базами данных. Понятие реляционный (англ. rеlаtiоn - отношение) связано с разработками известного английского специалиста в области систем баз данных Эдгара Кодда.

Эти модели характеризуются простотой структуры данных, удобным для пользователя табличным представлением и возможностью использования формального аппарата алгебры отношений и реляционного исчисления для обработки данных.

В данном курсовом проекте разработана база данных для приложения база данных World of Warcraft. Назначение разработки заключается в следующем: создать удобную БД для хранения информации об игровых объектах, а так же статьях касательно игры.

Перед разработкой были поставлены следующие задачи: получить возможность просматривать, редактировать, добавлять данные, получать результаты запросов. Так же необходимо обеспечить удобную работу для пользователей приложения.

1.  Постановка задачи и анализ предметной области информационной системы

1.1 Постановка задачи и анализ предметной области.

  Разрабатываемая информационная система будет разделяться на 3 части: БД по игровым объектам, руководство по рациональному использованию игровых ресурсов и система регистрации и авторизации.

1. БД по игровым объектам будет состоять из следующих сущностей и атрибутов:

1.1 объекты

         1.1.1 оружие

         1.1.2 броня

         1.1.3 символы

         1.1.4 расходуемые материалы

                   * еда

                   * зелья

                   * настои

1.2 навыки

         1.2.1 жрец

         1.2.2 разбойник

         1.2.3 чернокнижник

         1.2.4 охотник

         1.2.5 друиды

         1.2.6 рыцарь смерти

         1.2.7 воин

         1.2.8 маг

         1.2.9 шаман

         1.2.10 монах

         1.2.11 охотник на демонов

         1.2.12 паладин

1.3 таланты

1.3.1 жрец

         * разбойник

         * чернокнижник

         * охотник

         * друиды

         * рыцарь смерти

         * воин

         * маг

         * шаман

         * монах

         * охотник на демонов

         * паладин

1.4 питомцы охотника

         * хитрость

         * упорство

         *  свирепость

1.5 боевые питомцы (МоР+)

1.6 существа

1.7 профессии

         1.7.1 ювелирное дело

         1.7.2 алхимия

         1.7.3 травничество

         1.7.4 первая помощь

         1.7.5 кулинария

         1.7.6 наложение чар

         1.7.7 кожевничетво

         1.7.8 портняжное дело

         1.7.9 инженерное дело

         1.7.10 горное дело

1.8 руды

1.9 реагенты

2. Руководства по рациональному поведению персонажей различных классов будут разделены на:

2.1 класс

2.2 введение

2.3 аббревиатуры

2.4 таланты

2.5 символы

2.6 экипировка

2.7 зачарование

2.8 капы характеристик

2.9 2х2

2.10 3х3

3. Система регистрации и авторизации будет иметь поля:

3.1 логин

3.2 пароль

3.3 класс пользователя

3.4 сообщения

3.5 электронная почта

3.6 штрафы

3.7 дата регистрации

3.8 последний вход

3.9 рейтинг

3.10 пол    

3.11 возраст


1.2       Моделирование бизнес процессов приложения.

Бизнес процессы описаны в ниже представленной таблице.

Бизнес-процесс

Исполнитель

Входные данные

Выходные данные

Ограничения

Поставщик

Содержание

Потребитель

Содержание

1

Добавление

Модератор

Пользователь/

Модератор

Предложение на добавление игрового

объекта

Посетители сайта

Игровые объекты

- Каждому объекту должен быть назначен уникальный идентификатор

- Объект не может быть добавлен до

того, пока не пройдет проверку

модератором

2

Удаление

Модератор

Пользователь/

Модератор

Игровые

 объекты

Посетители сайта

Удаление

 игрового объекта

- Объект не может быть удален до

того, пока не пройдет проверку

модератором

3

Редактирование

Модератор

Модератор

Игровые

 объекты

Посетители сайта

Измененная информация об игровых

 объектах

- Ограничивается формой заполнения

Бизнес-процесс

Исполнитель

Входные данные

Выходные данные

Ограничения

Поставщик

Содержание

Потребитель

Содержание

1

Добавление

Модератор

Пользователь/

Модератор

Предложение на добавление статьи

Посетители сайта

Статья

- Каждому объекту должен быть назначен уникальный идентификатор

- Статья не может быть добавлена до

того, пока не пройдет проверку

модератором

2

Удаление

Модератор

Пользователь/

Модератор

Статья

Посетители сайта

Удаление

 статьи

- Статья не может быть удалена до

того, пока не пройдет проверку

модератором

3

Редактирование

Модератор

Пользователь/

Модератор

Игровые

 объекты

Посетители сайта

Измененная информация об игровых

 объектах

- Ограничивается формой заполнения

Таб. 1


1.3      Построение исходной концептуальной модели предметной области.

Концептуальная модель представлена ниже:

Имя приложения

Фрагмент предметной области

Задачи, решаемые пользователем

1

БД по игровым объектам и НИП

БД по игровым объектам будет делиться на игровые предметы, НИП, задания

Пользователь: заполнение; комментирование;

Модератор: заполнение; удаление; комментирование; редактирование

2

Раздел руководства по рациональному использованию классов

Статьи будут созданы для различных команд игроков с функцией сортировки и поиска по игровым классам

Пользователь: создание; редактирование; комментирование;

Модератор: создание; редактирование; комментирование; удаление

3

Система регистрации пользователя

Регистрация пользователя с различным функционалом и привилегии

Пользователь: создание аккаунта; редактирование информации; удаления аккаунта;

Модератор: редактирование информации; удаления аккаунта; блокировка аккаунтов пользователей

Таб. 2

2      Проектирование приложения

2.1       Информационные потребности пользователя приложения.

Пользователь должен обладать знаниями в области, посвященной данному приложению. Должен владеть элементарными знаниями компьютера и операционной системы.

2.2      Технические требования и ограничения на разработку приложения.

2.2.1 Выбор архитектуры

 Для разработки веб-приложения используется трёхуровневая архитектурная модель программного комплекса, предполагающая наличие в нём трёх компонентов: клиента, сервера приложений (к которому подключено клиентское приложение) и сервера баз данных (с которым работает сервер приложений).

Клиент (слой клиента) — это интерфейсный (обычно графический) компонент комплекса, предоставляемый конечному пользователю. Этот уровень не должен иметь прямых связей с базой данных (по требованиям безопасности и масштабируемости), быть нагруженным основной бизнес-логикой (по требованиям масштабируемости) и хранить состояние приложения (по требованиям надёжности). На этот уровень обычно выносится только простейшая бизнес-логика: интерфейс авторизации, алгоритмы шифрования, проверка вводимых значений на допустимость и соответствие формату, несложные операции с данными (сортировка, группировка, подсчёт значений), уже загруженными на терминал.

Сервер приложений (средний слой, связующий слой) располагается на втором уровне, на нём сосредоточена бо́льшая часть бизнес-логики. Вне его остаются только фрагменты, экспортируемые на клиента (терминалы), а также элементы логики, погруженные в базу данных (хранимые процедуры и триггеры). Реализация данного компонента обеспечивается связующим программным обеспечением. Серверы приложений проектируются таким образом, чтобы добавление к ним дополнительных экземпляров обеспечивало горизонтальное масштабирование производительности программного комплекса и не требовало внесения изменений в программный код приложения.

Сервер баз данных (слой данных) обеспечивает хранение данных и выносится на отдельный уровень, реализуется, как правило, средствами систем управления базами данных, подключение к этому компоненту обеспечивается только с уровня сервера приложений.

2.2.2 Требования к аппаратно-программному окружению.

Поскольку клиент приложения, который находится на стороне пользователя не нагружен какой-либо логикой, а лишь являет собой набор интерфейсов, конфигурация ПК может быть минимальной, способной поддерживать работу браузера. Так же необходимо интернет соединение.

Из программного обеспечения стоит выделить наличие сетевых драйверов, прикладного программного обеспечения для просмотра и управления веб-страницами и приложениями.

2.2.3 Технологии и средства разработки.

Для разработки использовались следующие средства:

Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems. Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине вне зависимости от компьютерной архитектуры. 

Play — фреймворк с открытым исходным кодом для веб-приложений, написанный на Scala и Java, поддерживающий схему MVC.

IntelliJ IDEA — интегрированная среда разработки программного обеспечения на многих языках программирования, в частности Java, javascript, Python, разработанная компанией JetBrains.

CRUD — (англ. create, read, update, delete — «создание, чтение, обновление, удаление») сокращённое именование 4-х базовых функций, используемых при работе с персистентными хранилищами данных.

Secure – модуль разработки, помогающий установить базовые концепции аутентификации и авторизации в приложении. Предоставляет доступ к простейшим controllers.Secure контроллерам, определяющим набор интерсептеров, которые можно добавлять в свои собственные контроллеры используя аннотацию @With

2.3      Логическое проектирование

Были созданы MVC модели на основе библиотеки play.db.jpa.Model.

Для наглядности кода во всех объектах, были удалены валидации, аннотации, а так же методы, поскольку они не влияют на проектирование самой БД.

Модель User

public class User extends Model { 


public String email; 

public String password; 

public String fullname; 

public boolean isAdmin; 

}

3      Разработка приложения

3.1       Физическое моделирование

По средствам аннотации @Entity, интерфейс программирования приложений (API с вытекающим из него JPA) позволяет добавлять, удалять или редактировать таблицы и их значения через контроллеры модели MVC, а так же через используемую в моделях бизнес-логику.

В приложении А опубликована база данных после миграции данных и их параметров из моделей.

3.2      Разработка MVC модели

3.2.1 Разработка Model

Для создания записей в базе данных, а так же корректного обращения к ним, необходимо создать модель пользователя по всем канонам работы с фреймворком. Она будет выглядеть следующим образом:

@Entity 
public class User extends Model { 

@Email 
@Required 
public String email; 

@Required 
public String password; 

public String fullname; 

public boolean isAdmin; 

public User(String email, String password, String fullname) { 
this.email = email; 
this.password = password; 
this.fullname = fullname; 


public static User connect(String email, String password) { 
return find("byEmailAndPassword", email, password).first(); 


public String toString() { 
return email; 


}

Модель Comment

public class Comment extends Model {

    @Required

    public String author;

    @Required

    public Date postedAt;

    @Lob

    @Required

    @MaxSize(10000)

    public String content;

    @ManyToOne

    @Required

    public Post post;

    public Comment(Post post, String author, String content) {

        this.post = post;

        this.author = author;

        this.content = content;

        this.postedAt = new Date();

    }

    public String toString() {

        return content.length() > 50 ? content.substring(0, 50) + "..." : content;

    }

}

3.2.2Разработка Controller

Все запросы к базе данных осуществляются по средствам обращения View к Controller, контроллеры для регистрации а так же авторизации будут выглядеть следующим образом:

Контроллер Admin

public class Admin extends Controller {

    @Before

    static void setConnectedUser() {

        if(Security.isConnected()) {

            User user = User.find("byEmail", Security.connected()).first();

            renderArgs.put("user", user.fullname);

        }

    }

    public static void index() {

        List posts = Post.find("author.email", Security.connected()).fetch();

        render(posts);

    }

    public static void form(Long id) {

        if(id != null) {

            Post post = Post.findById(id);

            render(post);

        }

        render();

    }

    public static void save(Long id, String title, String content, String tags) {

        Post post;

        if(id == null) {

            // Create post

            User author = User.find("byEmail", Security.connected()).first();

            post = new Post(author, title, content);

        } else {

            // Retrieve post

            post = Post.findById(id);

            post.title = title;

            post.content = content;

            post.tags.clear();

        }

        // Set tags list

        for(String tag : tags.split("s+")) {

            if(tag.trim().length() > 0) {

                post.tags.add(Tag.findOrCreateByName(tag));

            }

        }

        // Validate

        validation.valid(post);

        if(validation.hasErrors()) {

            render("@form", post);

        }

        // Save

        post.save();

        index();

    }

}

Контроллер User, предназначенный для активации CRUD директории

public class Users extends CRUD {   

}

Контроллер Application

public class Application extends Controller {

    @Before

    static void addDefaults() {

        renderArgs.put("blogTitle", Play.configuration.getProperty("blog.title"));

        renderArgs.put("blogBaseline", Play.configuration.getProperty("blog.baseline"));

    }

    public static void index() { (Отображение главной станицы)

        Post frontPost = Post.find("order by postedAt desc").first();

        List olderPosts = Post.find("order by postedAt desc").from(1).fetch(10);

        render(frontPost, olderPosts);

    }

    public static void show(Long id) { (Показ динамического контента)

        Post post = Post.findById(id);

        String randomID = Codec.UUID();

        render(post, randomID);

    }

    public static void postComment( (Сообщение об ошибке)

        Long postId,

        @Required(message="Author is required") String author,

        @Required(message="A message is required") String content,

        @Required(message="Please type the code") String code,

        String randomID)

    {

        Post post = Post.findById(postId);

        if(!Play.id.equals("test")) {

            validation.equals(code, Cache.get(randomID)).message("Invalid code. Please type it again");

        }

        if(validation.hasErrors()) {

            render("Application/show.html", post, randomID);

        }

        post.addComment(author, content); (Закрепление комментария за постом)

        flash.success("Thanks for posting %s", author); (Отображение методов без обновления страницы)

        Cache.delete(randomID); (Удаление капчи из кэша)

        show(postId);

    }

    public static void captcha(String id) {

        Images.Captcha captcha = Images.captcha();

        String code = captcha.getText("#E4EAFD"); (Цвет)

        Cache.set(id, code, "30mn"); (Обновление капчи)

        renderBinary(captcha);

    }

    public static void listTagged(String tag) { (Поиск по тэгам)

        List posts = Post.findTaggedWith(tag);

        render(tag, posts);

    }

}

publicclassSecurityextendsSecure.Security { (Набор интерсепторов, анотаций)

static boolean authentify(String username, String password) { (Проверка пользователя сессии)
return User.connect(username, password) != null; (Находится ли в сессии)


static boolean check(String profile) { (Проверка на админа)
if("admin".equals(profile)) { 
return User.find("byEmail", connected()).first().isAdmin; 

return false; 


static void onDisconnected() { (Перво на главную + выкидывает из сессии)
Application.index(); 


static void onAuthenticated() { (Вводит в сессию)
Admin.index(); 


}

3.2.3Разработка триггеров

По средствам данного триггера мы инкрементируем счетчик комментариев в таблице юзера, а так же к тому, чему был оставлен этот комментарий. Второй функцией триггера является запись URL, это требуется для корректного отображения новостей (чтобы в дальнейшем не приходилось писать запросы на выборку). Третьей функцией является запись названия предмета/гайда, за которым закреплён комментарий.

CREATE TRIGGER `add_count_comment` AFTER INSERT ON `comment`

 FOR EACH ROW BEGIN

UPDATE user SET user.countcomment= user.countcomment+1

WHERE user.id = NEW.user_id;

CASE NEW.`owner_name`

WHEN "Guide" THEN UPDATE `guide` SET `guide`.`comment` = `guide`.`comment`+1 WHERE `guide`.id = NEW.`owner_id` ;

WHEN "Item" THEN UPDATE `item` SET `item`.`comment` = `item`.`comment`+1 WHERE `item`.`id` = NEW.`owner_id` ;

END CASE

CASE NEW.`owner_name`

WHEN "Guide" THEN SET userurl = (SELECT url FROM `guide` WHERE `guide`.id= NEW.`owner_id`);

WHEN "Item" THEN SET userurl = (SELECT url FROM `item` WHERE item.id=NEW.`owner_id`);

END CASE;

CASE NEW.`owner_name`

WHEN "Guide" THEN SET usertitle = (select title from `guide` where guide.id=NEW.`owner_id`);

WHEN "Item" THEN SET usertitle = (select title from `item` where item.id=NEW.`owner_id`);

END CASE;

INSERT INTO user_has_events VALUES (NEW.user_id,NEW.id,"Comments",NOW(),userurl , usertitle );

END

Триггер  на удаление будет выглядеть аналогично:

CREATE TRIGGER `del_count_comment` AFTER DELETE ON `comments`

FOR EACH ROW BEGIN

UPDATE user SET user.countcomment= user.countcomment -1 WHERE user.id = OLD.user_id;

CASE OLD.`owner_name` WHEN "Guide" THEN UPDATE `guide` SET `guide`.`comment` = `guide`.`comment`-1 WHERE `guide`.`id` = OLD.`owner_id` ;

WHEN "Item" THEN UPDATE `item` SET `item`.`comment` = `item`.`comment`-1 WHERE `item`.`id` = OLD.`owner_id` ;

END CASE;

END


4     Тестирование приложения

Когда приложение запущенно в тестовом режиме, точка входа в Play осуществляется немного иначе, это может быть настроено в application.conf файле. По умолчанию, эти конфигурации запускают операционную БД, однако для тестирования самой базы, настройки были изменены на MySQL.

Тестовая база в Play может быть построена несколькими способами. В каждом случае мы создаем кусок кода для создания тестовой информации, схожей с той что будет поступать в приложение от реальных пользователей. Так же можно использовать YAML  для подгрузки данных из файла, что мы и будем делать. YAML база представлена в приложении Б.

Для запуска тестов необходимо создать java файл в директории test. Полный список тестов указан в приложении B.


Заключение

Разработанная в ходе выполнения курсового проекта база данных World of Warcraft, является актуальной на сегодняшний день и имеет большую практическую значимость. Она помогает игрокам находить информацию об интересующих предметах, читать статьи и руководства по игре, а так же делиться своим мнением по поводу предметов и статей.

В результате выполнения данного курсового проекта были решены задачи, поставленные в начале работы. Была разработана структура базы данных; в программу были включены функции поиска, выполнения различных запросов. При этом были учтены все требования, выдвинутые в начале выполнения данного проекта.

Разработанная программа устойчиво выполняет все свои функции, но теперь стоит задача сделать ее более совершенной и более расширенной.


Список используемой литературы

1.     Вэйн Еллис, Введение в Play framework , ред. 2010 год.

2.  Playframework.org/guides/1.2.X

3. The Art and Science of Java by Eric S. Roberts, Stanford University 2006 г.

4. Wikipedia.org/java

5. Wikipedia.org/idea

6. Wikipedia.org/playframework

7. Базы данных, конспекты лекций

Приложение

Приложение А

Таблица user

Таблица comment


Приложение Б.

 


Приложение В.

public class BasicTest extends UnitTest {

    @Before

    public void setup() {

        Fixtures.deleteAll();

    }

    @Test

    public void createAndRetrieveUser() {

        // Create a new user and save it

        new User("bob@gmail.com", "secret", "Bob").save();

        // Retrieve the user with bob username

        User bob = User.find("byEmail", "bob@gmail.com").first();

        // Test

        assertNotNull(bob);

        assertEquals("Bob", bob.fullname);

    }

    @Test

    public void tryConnectAsUser() {

        // Create a new user and save it

        new User("bob@gmail.com", "secret", "Bob").save();

        // Test

        assertNotNull(User.connect("bob@gmail.com", "secret"));

        assertNull(User.connect("bob@gmail.com", "badpassword"));

        assertNull(User.connect("tom@gmail.com", "secret"));

    }

    @Test

    public void createPost() {

        // Create a new user and save it

        User bob = new User("bob@gmail.com", "secret", "Bob").save();

        // Create a new post

        new Post(bob, "My first post", "Hello world").save();

        // Test that the post has been created

        assertEquals(1, Post.count());

        // Retrieve all post created by bob

        List bobPosts = Post.find("byAuthor", bob).fetch();

        // Tests

        assertEquals(1, bobPosts.size());

        Post firstPost = bobPosts.get(0);

        assertNotNull(firstPost);

        assertEquals(bob, firstPost.author);

        assertEquals("My first post", firstPost.title);

        assertEquals("Hello world", firstPost.content);

        assertNotNull(firstPost.postedAt);

    }

    @Test

    public void postComments() {

        // Create a new user and save it

        User bob = new User("bob@gmail.com", "secret", "Bob").save();

        // Create a new post

        Post bobPost = new Post(bob, "My first post", "Hello world").save();

        // Post a first comment

        new Comment(bobPost, "Jeff", "Nice post").save();

        new Comment(bobPost, "Tom", "I knew that !").save();

        // Retrieve all comments

        List bobPostComments = Comment.find("byPost", bobPost).fetch();

        // Tests

        assertEquals(2, bobPostComments.size());

        Comment firstComment = bobPostComments.get(0);

        assertNotNull(firstComment);

        assertEquals("Jeff", firstComment.author);

        assertEquals("Nice post", firstComment.content);

        assertNotNull(firstComment.postedAt);

        Comment secondComment = bobPostComments.get(1);

        assertNotNull(secondComment);

        assertEquals("Tom", secondComment.author);

        assertEquals("I knew that !", secondComment.content);

        assertNotNull(secondComment.postedAt);

    }

    @Test

    public void useTheCommentsRelation() {

        // Create a new user and save it

        User bob = new User("bob@gmail.com", "secret", "Bob").save();

        // Create a new post

        Post bobPost = new Post(bob, "My first post", "Hello world").save();

        // Post a first comment

        bobPost.addComment("Jeff", "Nice post");

        bobPost.addComment("Tom", "I knew that !");

        // Count things

        assertEquals(1, User.count());

        assertEquals(1, Post.count());

        assertEquals(2, Comment.count());

        // Retrieve the bob post

        bobPost = Post.find("byAuthor", bob).first();

        assertNotNull(bobPost);

        // Navigate to comments

        assertEquals(2, bobPost.comments.size());

        assertEquals("Jeff", bobPost.comments.get(0).author);

        // Delete the post

        bobPost.delete();

        // Chech the all comments have been deleted

        assertEquals(1, User.count());

        assertEquals(0, Post.count());

        assertEquals(0, Comment.count());

    }

    @Test

    public void fullTest() {

        Fixtures.load("data.yml");

        // Count things

        assertEquals(2, User.count());

        assertEquals(3, Post.count());

        assertEquals(3, Comment.count());

        // Try to connect as users

        assertNotNull(User.connect("bob@gmail.com", "secret"));

        assertNotNull(User.connect("jeff@gmail.com", "secret"));

        assertNull(User.connect("jeff@gmail.com", "badpassword"));

        assertNull(User.connect("tom@gmail.com", "secret"));

        // Find all bob posts

        List bobPosts = Post.find("author.email", "bob@gmail.com").fetch();

        assertEquals(2, bobPosts.size());

        // Find all comments related to bob posts

        List bobComments = Comment.find("post.author.email", "bob@gmail.com").fetch();

        assertEquals(3, bobComments.size());

        // Find the most recent post

        Post frontPost = Post.find("order by postedAt desc").first();

        assertNotNull(frontPost);

        assertEquals("About the model layer", frontPost.title);

        // Check that this post has two comments

        assertEquals(2, frontPost.comments.size());

        // Post a new comment

        frontPost.addComment("Jim", "Hello guys");

        assertEquals(3, frontPost.comments.size());

        assertEquals(4, Comment.count());

    }

    @Test

    public void testTags() {

        // Create a new user and save it

        User bob = new User("bob@gmail.com", "secret", "Bob").save();

        // Create a new post

        Post bobPost = new Post(bob, "My first post", "Hello world").save();

        Post anotherBobPost = new Post(bob, "My second post post", "Hello world").save();

        // Well

        assertEquals(0, Post.findTaggedWith("Red").size());

        // Tag it now

        bobPost.tagItWith("Red").tagItWith("Blue").save();

        anotherBobPost.tagItWith("Red").tagItWith("Green").save();

        // Check

        assertEquals(2, Post.findTaggedWith("Red").size());       

        assertEquals(1, Post.findTaggedWith("Blue").size());

        assertEquals(1, Post.findTaggedWith("Green").size());

        assertEquals(1, Post.findTaggedWith("Red", "Blue").size());  

        assertEquals(1, Post.findTaggedWith("Red", "Green").size());  

        assertEquals(0, Post.findTaggedWith("Red", "Green", "Blue").size()); 

        assertEquals(0, Post.findTaggedWith("Green", "Blue").size());   

        List cloud = Tag.getCloud();

        Collections.sort(cloud, new Comparator() {

            public int compare(Map m1, Map m2) {

                return m1.get("tag").toString().compareTo(m2.get("tag").toString());

            }

        });

        assertEquals("[{tag=Blue, pound=1}, {tag=Green, pound=1}, {tag=Red, pound=2}]", cloud.toString());

    }

}


Информация о файле
Название файла анализ предметной области информационной системы от пользователя z3rg
Дата добавления 17.2.2016, 2:00
Дата обновления 17.2.2016, 2:00
Тип файла Тип файла (zip - application/zip)
Скриншот Не доступно
Статистика
Размер файла 1 мегабайт (Примерное время скачивания)
Просмотров 6064
Скачиваний 138
Оценить файл