\documentclass[a4paper,fontsize=14bp]{article}

\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
%\setcounter{secnumdepth}{0}
\numerationTop

\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader

% номер, тема, предмет, ?а, кто
\makeReportTitle{лаботаторной}{2}{Создание и использование метамоделей}{Моделирование информационных процессов и систем}{а}{Кадырбаева А.Р.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель работы}
Ознакомление с методами и средствами model-driven development, создания и использования метамоделей, автоматической генерации кода.
Задание: необходимо ознакомиться с основами работы с метамоделями с использованием Ecore, а также освоить применение инструментов Eclipse EMF.

\section{Выполнение}
Для выполнения работы было установлено программное обеспечение Eclipse Modeling Tools\footnote{прямая ссылка на страницу загрузок: https://www.eclipse.org/downloads/packages/}.
\begin{enumerate}
\item Создан новый проект с именем webpage и классами, указанными на рис. \hrf{pic:first-model}
  \begin{figure}[H]
    \centering
    \includegraphics[height=8cm]{02-frist-model.png}
    \caption{Диаграмма классов с отношениями}
    \label{pic:first-model}
  \end{figure}
\item Для верхнего уровня модели был задан адрес артефакта \code{com.vogella.emf.webpage.model}.
\item Был сгенерирован код на языке Java для описанной модели.
\item Созданы ещё два проекта: \code{webpage.edit} и \code{webpage.editor}. На основе модели в рамках запущенного \code{Webpage.editor} были созданы демонстрационные экземпляры сущностей \code{Web} и \code{Webpage} (рис. \hrf{pic:instance-first-model}).
  \begin{figure}[H]
    \centering
    \includegraphics[height=8cm]{02-instance-first-model}
    \caption{Экземпляр приложения по модели}
    \label{pic:instance-first-model}
  \end{figure}
\item В методических указаниях не очевидно, какой именно проект нужно создать и в какую часть манифеста добавить зависимость, пункт пропущен.
\item Была создана переопределённая функция \code{toString();} При переопределении была отмечена особеность, что сохранить многострочное тело функции в модели недостаточно (в файле \code{genmodel} сохраняется только первая строка), необходимо добавить тело функции полностью непосредственно в свойства функции в файле \code{genmodel}.
\item Был создан тестовый метод ввода некоторого целого числа.
\item Были проработаны механизмы наследования классов.
\end{enumerate}

\section{Индивидуальное задание}
Индивидуальным заданием к лабораторной работе было описание небольшого проекта в приложении для моделирования и создание классов на языке Java по заданному описанию. Было выбрано приложение-расширение для обмена сообщениями в информационных системах.

Для обмена сообщениями в системе необходимо хранить:
\begin{itemize}
\item Объект сообщения;
\item Данные сообщения;
\item Тип данных сообщения;
\item Метаданные сообщения;
\item Пользователя;
\item Роль пользователя;
\end{itemize}

В Eclipse Modeling Framework была создана модель данных, показанная на рис. \hrf{pic:indi-model}
\begin{figure}[H]
  \centering
  \includegraphics[width=12cm]{02-mailing.png}
  \caption{Упрощённая модель данных приложения для обмена сообщениями}
  \label{pic:indi-model}
\end{figure}

Поскольку все сообщения сохраняются в БД и сразу доступны всем пользователям, то необходимо определить разделение прав доступа к сообщениям (видимость только отправителю и получателю), что сделано привязкой сообщения к пользователю. Также пользователь может начать писать сообщение, но не отправить его, удалить сообщение или отправить в корзину/избранное/папку. Для всех манипуляций с сообщением создан класс метаинформации о сообщении, содержащий флажки (булевы значения), говорящие о разных состояниях объекта сообщения. Содержание сообщения может быть разнообразным, поэтому принято решение хранить все данные в максимально простом типе: обычный массив байтов, который может быть представлен как текст, изображение, ссылка на сущность в приложении, другое сообщение, пользователя, и так далее. Пользователи в данном варианте приложения могут иметь несколько ролей: самая простая - это просто отправка и получение сообщений, модератор - пользователь, имеющий право изменять метаинформацию чужих сообщений, администратор - пользователь, имеющий право удалять чужие сообщения. Никакие пользователи не могут редактировать сообщения для сохранения достоверности. Все сообщения удаляются с применением технологии soft-delete, которая не удаляет объект из БД, а только помечает его, как удалённый. Сгенерированные структуры представлены на рис. \hrf{pic:descriptors}.

\begin{figure}[H]
  \centering
  \begin{subfigure}[b]{0.4\textwidth}
    \centering
    \includegraphics[width=\textwidth]{02-mailing-ecore.png}
    \caption{Ecore}
    \label{pic:ecore}
  \end{subfigure}
  \hfill
  \begin{subfigure}[b]{0.4\textwidth}
    \centering
    \includegraphics[width=\textwidth]{02-mailing-genmodel.png}
    \caption{Genmodel}
    \label{pic:genmodel}
  \end{subfigure}
  \caption{Сгенерированные файлы метамоделей}
  \label{pic:descriptors}
\end{figure}

Полные листинги сгенерированных классов представлены в приложениях \hrf{appendix:interface}, \hrf{appendix:implement}, \hrf{appendix:util}.

\section{Контрольные вопросы}
\subsection{Можно ли установить пустую строку в качестве значения по умолчанию? Как это сделать? Как удалить пустое значение?}
Это возможно. Чтобы установить пустую строку в качестве значения по умолчанию, необходимо выполнить следующие действия:
\begin{enumerate}
\item выбрать атрибут;
\item в свойствах выбрать поле значения «Литерал значения по умолчанию»;
\item оставить значение пустым.
\end{enumerate}

Чтобы удалить это пустое значение, необходимо нажать «Восстановить значение по умолчанию» на панели инструментов.

\subsection{Что такое модель данных?}
Модель данных - это совокупность модели и метамодели, описывающих структуру и связи классов и объектов в приложении, составляющих абстрактное представление доступа к данным, с которым взаимодействует пользователь.

\subsection{Какие методы генерации классов существуют? Опишите их.}
Классы на языках программирования можно описывать несколькими способами:
\begin{itemize}
\item вручную по мере описания проекта и возникновения необходимости;
\item вручную согласно заранее описанной модели системы;
\item автоматизированно приложением codegen на основе описанной модели системы;
\item автоматизированно на основе метаданных ORM или реляционной БД;
\item автоматизированно одновременно с моделью БД (liquibase);
\item автоматизированно на основе описанной модели с помощью приложений для моделирования.
\end{itemize}

\newpage
\appendix
%\setcounter{secnumdepth}{0}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Alph{subsection}}

\subsection{Листинги интерфейсов}
\label{appendix:interface}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingFactory.java]{build/src-gen/mailing/MailingFactory.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingPackage.java]{build/src-gen/mailing/MailingPackage.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=Message.java]{build/src-gen/mailing/Message.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageContent.java]{build/src-gen/mailing/MessageContent.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageContentType.java]{build/src-gen/mailing/MessageContentType.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageMeta.java]{build/src-gen/mailing/MessageMeta.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=User.java]{build/src-gen/mailing/User.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserRole.java]{build/src-gen/mailing/UserRole.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserRolesEnum.java]{build/src-gen/mailing/UserRolesEnum.java}
\subsection{Листинги реализаций}
\label{appendix:implement}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingFactoryImpl.java]{build/src-gen/mailing/impl/MailingFactoryImpl.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingPackageImpl.java]{build/src-gen/mailing/impl/MailingPackageImpl.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageContentImpl.java]{build/src-gen/mailing/impl/MessageContentImpl.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageImpl.java]{build/src-gen/mailing/impl/MessageImpl.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MessageMetaImpl.java]{build/src-gen/mailing/impl/MessageMetaImpl.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserImpl.java]{build/src-gen/mailing/impl/UserImpl.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=UserRoleImpl.java]{build/src-gen/mailing/impl/UserRoleImpl.java}
\subsection{Листинги утилитарных классов}
\label{appendix:util}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingAdapterFactory.java]{build/src-gen/mailing/util/MailingAdapterFactory.java}
% \lstinputlisting[language=Java, style=JCodeStyle, caption=MailingSwitch.java]{build/src-gen/mailing/util/MailingSwitch.java}

\end{document}
