Библиотека сайта rus-linux.net
Фреймворк Violet
Глава 22 из книги "Архитектура приложений с открытым исходным кодом", том 1.
Оригинал: "Violet", глава из книги "The Architecture of Open Source Applications"
Автор: Cay Horstmann
Перевод: Н.Ромоданов
22.9. Архитектура плагинов
Программисту, знакомому с графикой 2D, будет несложно добавить в Violet новый тип диаграммы. Например, диаграммы активностей были предоставлены третьими лицами. Когда мне потребовалось создать синтаксические диаграммы и диаграммы ER, я решил, что быстрее написать расширения для Violet, а не возиться с Visio или Dia. (На реализацию диаграмм каждого типа потребовалось по одному дню).
Эти реализации не требуются знание всего фреймворка Violet. Необходимы только интерфейсы классов graph, node и edge и соответствующие их реализации. Чтобы упростить задачу разработчикам, я, самостоятельно отделив их от фреймворка, разработал простую архитектуру плагинов.
Конечно, в многих программах есть архитектура плагинов, причем достаточно сложная. Когда кто-то предположил, что Violet должен поддерживать OSGi, я содрогнулся и вместо этого реализовал более простую вещь, которая работает.
Авторы просто создают файл JAR со своими реализациями классов graph, node и edge и помещают его в папку плагинов. Когда Violet запускается, он загружает эти плагины с помощью класса Java ServiceLoader
. Этот класс был разработан для загрузки сервисов, например, драйверов JDBC. ServiceLoader
загружает файлы JAR, в которых должен быть предоставлен класс, реализующий данный интерфейс (в нашем случае интерфейс Graph
).
Каждый файл JAR должен иметь подкаталог META-INF/services, содержащий файл, имя которого является полным квалифицированным именем класса интерфейса (например, com.horstmann.violet.Graph
), и в котором в каждой строке указывается имя реализации каждого класса. ServiceLoader
строит загрузчик классов для каталога плагинов и загружает все плагины:
ServiceLoader<Graph> graphLoader = ServiceLoader.load(Graph.class, classLoader); for (Graph g : graphLoader) // ServiceLoader<Graph> implements Iterable<Graph> registerGraph(g);
Это простое, но полезное средство стандартного языка Java, которое может оказаться ценным для ваших собственных проектов.
22.10. Заключение
Как и многие другие проекты с открытым исходным кодом, проект Violet родился вследствие неудовлетворенных потребностей - рисовать простые диаграммы UML с минимальной суетой. Violet стал возможным благодаря удивительной широте платформы Java SE, и в нем используется набор разнообразных технологий, которые являются частью этой платформы. В этой статье я описал, как в Violet используются технологии Java Beans, хранения данных, Java Web Start, Java 2D, Swing Undo / Redo и средства загрузки сервисов. Не всегда достаточно ясно, как пользоваться этими технологиями в качестве базы Java и Swing, но они могут значительно упростить архитектуру настольных приложений. Они позволили мне, первоначально единственному разработчику, создать в течение нескольких месяцев успешное приложение, работая над ним неполный рабочий день. Использование этих стандартных механизмов позволило предоставить другим разработчикам возможность самостоятельно улучшать Violet, а также применять его отдельные части в своих собственных проектах.
Примечания
- В то время я еще не знал о замечательной программе UMLGraph, созданной Диомидисом Спинелисом (Diomidis Spinellis) [Spi03]
- http://jung.sourceforge.net
- http://www.omg.org/technology/documents/formal/xmi.htm
- http://jcp.org/en/jsr/detail?id=57
- http://jcp.org/en/jsr/detail?id=296
- http://kenai.com/projects/guts
- http://horstmann.com/gridworld
Продолжение статьи: К началу статьи.