Виртуальная файловая система web

Для web-приложения существует виртуальная файловая система. Она доступна через сервис jandcode.core.web.WebService, в частности через набор методов из jandcode.core.web.virtfile.IVirtFileService.

Виртуальный файл представлен интерфейсом jandcode.core.web.virtfile.VirtFile.

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

На одну и ту же виртуальную папку можно примонтировать несколько реальных.

Одна и та же реальная папка может быть примонтирована к разным виртуальным путям.

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

Пустой виртуальный путь интерпретируется как корень виртуальной файловой системы.

Пример описания точек монтирования в модуле:

<root>

    <web>

        <mount name="my-mount-point-1"
               virtualPath=""
               realPath="d:/temp"/>

        <mount name="my-mount-point-2"
               virtualPath=""
               realPath="d:/data"/>

        <mount name="my-mount-point-2"
               virtualPath="data/temp"
               realPath="#{path}/data-temp"/>

    </web>

</root>

Конфигурация module.cfx

web/mount

Описание точки монтирования.

Формат:

<root>
    <web>
        <mount name="NAME"
               virtualPath="VIRTUAL-PATH"
               realPath="REAL-PATH"
               class="jandcode.core.web.virtfile.IMountProvider"
        />
    </web>
</root>
  • name - уникальное имя точки монтирования на уровне приложения
  • virtualPath - виртуальный путь для точки монтирования
  • realPath - реальный путь, для монтирования в виртуальный путь
  • class - провайдер точек монтирования. В реальном приложении обычно не используется. Этот класс должен создать набор точек монтирования. Если указан, то все атрибуты узла mount интерпретируются этим классом.

web/mount-module

Монтирование каталога модуля способом по умолчанию.

Формат:

<root>
    <web>
        <mount-module default="BOOL">
            <!-- особое монтирование в рамках модуля:

                <mount name="NAME"
                       virtualPath="VIRTUAL-PATH"
                       realPath="REAL-PATH"
                />

            -->
        </mount-module>
    </web>
</root>
  • default - монтировать ли модуль по умолчанию, описано ниже. Если не установлено, считается true

В большинстве случаев настройка выглядет так:

<root>
    <web>
        <mount-module/>
    </web>
</root>

Рекомендуется монтировать модули именно этой настройкой. Если в модуле явно определены точки монтирования web/mount, то следует иметь ввиду: они будут созданы после обработки mount-module для всех модулей. Если необходимо особое монтирование папок модуля, необходимо для этого использовать узлы web/mount-module/mount, формат которых совпадает с web/mount.

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

Корневая папка модуля монтируется в виртуальный каталог, соответствующий виртуальному пути модуля (имя пакета модуля, где точки заменены на '/'). Соответствует настройке:

<mount name="#{module}--mount-module"
       realPath="#{module.path}"
       virtualPath="#{module.packagepath}"/>

Если в корне модуля имеются специальные папки (их список и описание ниже), то каждая такая папка монтируется особым способом.

Список специальных папок:

  • webroot - монтируется в /. По соглашению используется для формирования корневой файловой системы или для перекрытия виртуальных файлов своей версией.

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

<mount name="#{module}--mount-module--webroot"
       realPath="#{module.path}/webroot"
       virtualPath=""/>

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

META-INF/jc-data/webroot

Каталоги META-INF/jc-data/webroot, которые были обнаружены в classpath у модулей, которые входят в приложение, автоматически монтируются в корневой каталог виртуальной файловой системы. Такие каталоги, к примеру, используются для поставки сторонних библиотек javascript. Они монтируются до применения настроек монтирования модулей, что позволяет, при необходимости, перекрыть файлы из библиотек своими версиями.

resource-webroot

Каталоги resource-webroot, которые были обнаружены в classpath, автоматически монтируются в корневой каталог виртуальной файловой системы.

Монтирование не учитывает модули, достаточно просто наличие пути в classpath.

Такие каталоги обычно генерируются какими либо сборщиками. В режиме разработки они обычно доступны напрямую, а в prod-режиме пакуются в jar-файлы.