\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}