WebDAV Интеграция поддержки протокола webDAV в систему. Фактически, библиотека Milton работает не с самими данными, а с их представлением в виде объектов определенных типов. В ней описаны Java интерфейсы, которые должны быть реализованы в классах приложения. Milton предоставляет отдельные интерфейсы для каждого метода webDAV. Это позволяет реализовать в приложении только ту функциональность, которая действительно необходима. Метод Интерфейс GET GetableResource HEAD GetableResource POST PostableResource PUT PutableResource PROPFIND PropFindableResouce MKCOL MakeCollectionableResource DELETE DeletableResource COPY CopyableResource MOVE MoveableResource LOCK LockableResource Основным способ интеграции данного инструмента является добавление в состав веб-приложения Milton сервлета – Java-программы, выполняющейся на стороне сервера и расширяющей его функциональность. Именно такой подход применяется в системе С3. Единственным параметром, который Milton-сервлет ожидает от приложения, является имя класса, реализующего интерфейс ResourceFactory. Объект именно этого класса создается сервлетом при каждом запросе webDAV клиента. Его задача – предоставление для дальнейшей обработки объекта, который содержит данные, адресованные в запросе. Интерфейсы, реализованные в предоставляемом объекте, определяют набор действий, которые могут быть выполнены с инкапсулированными данными. Например, для того, чтобы данные моги быть загружены с сервера по протоколу webDAV, соответствующий ресурс должен реализовывать интерфейс GetableResource. Базовым является интерфейс Resource, который описывает методы авторизации и аутентификации, получения имени ресурса и даты его изменения. От него наследуются остальные интерфейсы, определяющие функциональность связанную с конкретными ресурсами. Так, например, для того, чтобы данные моги быть загружены с сервера, соответствующий ресурс должен реализовывать интерфейс GetableResource, который описывает методы получения длинны и типа ресурса, а также метод, отвечающий за пересылку данных sendContent(). В простейшем случае, когда осуществляется только просмотр файловой структуры на сервере, в приложении каталогам должны соответствовать объекты с интерфейсом CollectionResource, а файлам - объекты с интерфейсом PropfindableResource. Из-за архитектурных особенностей ресурсы С3 не могут быть напрямую переданы для обработки сервлету, поэтому для его интеграции в систему были написаны классы-обертки, которые реализуют все необходимые интерфейсы (диаграмма 1.). Логически этот слой классов связывает понятие «ресурс» приложения с одноименным понятием библиотеки. Фактически классы прослойки являются адаптером, позволяющим сервлету работать с разработанной ранее объектной моделью приложения. Будем называть объекты из уровня прослойки, с которыми работает библиотека, dav-ресурсами. Каждый запрос характеризуют два атрибута: путь к ресурсу и метод, которым должна быть осуществлена обработка ресурса. Имя корневого каталога в передаваемом пути должно соответствовать имени рабочей группы, содержащей адресуемый ресурс. Доступные методы для каждого ресурса определяются внутри библиотеки по набору интерфейсов, которые данный ресурс реализует. Выбор ресурса по указанному пути осуществляется объектом класса DavResourceFactory. Его метод getResource() запускает процесс построения иерархии dav-объектов, отражающий виртуальную каталожную структуры группы (диаграмма 2.). Для связи dav-ресурсов с ресурсами приложения служат объекты типа DavContext, которые хранят в себе ссылки на рабочую группу и её корневой каталог, а также на сервисы (ResourceService, GroupService и UserServic), которые позволяют выполнять необходимые действия над объектами приложения. Данные объекты передаются в dav-ресурсы при создании и определяют их контекст. Реализация класса DavContext позволяет уйти от централизованного хранения контекста, что необходимо для корректной работы потоков, порождаемых при поступлении запроса от клиента. С каждым запросом связана отдельная иерархия ресурсов со своим контекстом, так что данные разных потоков не пересекаются. Диаграмма 1. Диаграмма классов-обёрток Диаграмма 2. Последовательность создания корневого каталога группы по запросу пользователя