Краткое описание утилиты ng.app.quota
=====================================

Утилита разработана для контроля размера объектов, содержащихся внутри
контейнера (и всех вложенных в него контейнеров). Утилита строит
гистограмму размеров объектов, содержащихся внутри контейнера и подсчитывает
некоторые статистические характеристики: минимальный, максимальный и средний
размер, количество объектов. В настройках утилиты можно установить
максимальный размер, при превышении которого утилита порождает исключение::

    ng.app.quota.quota.QuotaError
   
что дает возможность ограничить размер содержимого контейнера. Так как
утилита при подсчете размера не обращается к содержимому контейнера, то она
может использоваться не только в качестве ограничителя доступного объема 
ресурса, но и для подсчета статистики использования контейнеров
определенного вида (например, кешей и т.п.), что трудно сделать обычным
перебором содержимого контейнера из-за его длительности.

Принцип действия
----------------

Компонент **ng.app.quota** ассоциируется с любым объектом как
[keyword:аннотация] или регистрируется как утилита в сайт-менеджере (в
последнем случае ее действие распространяется на весь сайт). Специальный
диспетчер перехватывает события, связанные с созданием, удалением или
изменением размера объекта и диспетчеризует их для всех компонентов
**ng.app.quota**, которые должны учесть его размер.

Каждый компонент **ng.app.quota** ведет небольшой перечень вложенных
объектов, основанный на утилите **IIntIds**, что позволяет обрабатывать даже
события, связанные с удалением объектов.

В качестве размера объекта используется размер реплики перзистент-объекта в
хранилище, со всеми особенностями формирования такой реплики. Если ваш
объект не является перзистент-объектом (не имеет интерфейса IPersistent), то
вам надо разработать свой адаптер к интерфейсу
[name:ng.adapter:ng.adapter.recordsize.interfaces.IRecordSize], который
выполнит подсчет размера записи об объекте.


Требования к установке и настройке
----------------------------------

Возможны два варианта установки: установка для сайта и установка для
отдельного контейнера (компонента). В любом случае, до начала работ с
**ng.app.quota**, в сайт-менеджере должна быть зарегистрирована
утилита **IIntIds**.

Установка для сайта
~~~~~~~~~~~~~~~~~~~

Как только утилита **IIntIds** зарегистрирована, можно создать и
зарегистрировать утилиту **IQuota** (*Add Quota* и последующая регистрация с
пустым именем под интерфейсом **ng.app.quota.interfaces.IQuota**). На
вкладке *Quota* созданной утилиты можно увидеть гистограмму и
несколько полей, соответствующих интерфейсу **IQuota**:

    Quota :: Int
        Максимально допустимый суммарный размер объектов;
        
    Check quota :: Bool
        Проверять квоту (если этот флаг установлен, то по достижении
        суммарного размера величины Quota будет порождено исключение
        **ng.app.quota.quota.QuotaError**;
        
    Use statistic :: Bool
        Вести статистику размеров - если этот флаг не выбран, то компонент
        Quota будет фактически отключен.
        
Следующие поля доступны только для чтения :
    
    Size :: Int
        Суммарный размер объектов;
    
    Count :: Int
        Количество объектов;
    
    Average Size :: Float
        Средний размер объекта;
    
    Minimum :: Int
        Минимальный размер объекта;
    
    Maximum :: Int
        Максимальный размер объекта.
    
Установка для отдельного контейнера
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Принцип установки **ng.app.quota** для отдельного контейнера достаточно
обычен: нужно назначить компоненту-контейнеру интерфейс::

    ng.app.quota.interfaces.IQuotaAnnotataAble
    
после чего с каждым экземпляром этого компонента окажется ассоциирована
аннотация с интерфейсом **IQuota**, и в менеджерском интерфейсе компонента
появится вкладка *Quota*, такая же как и в случае утилиты. Существуют разные
способы назначить интерфейс как динамически (см. например
[name:ng.schema:ng.schema.interfaceswitcher]), так и статически. Для
простоты опишем только статический способ: в конфигурацию экземпляра
[keyword:zope3] нужно добавить директиву [keyword:ZCML]::

  <class class="ng.app.converter.cachestore.cachestore.Cachestore">
    <implements interface="ng.app.quota.interfaces.IQuotaAnnotable" />
    <implements interface="zope.annotation.interfaces.IAttributeAnnotatable" />
  </class>

В этом случае **ng.app.quota** используется как статистика кеша и
ограничение размера квоты разумнее отключить. В другом варианте
**ng.app.quota** используется во всех компонентах
**zope.app.folder.folder.Folder** ::

  <class class="zope.app.folder.folder.Folder">
    <implements interface="ng.app.quota.interfaces.IQuotaAnnotable" />
  </class>

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

Заключение
----------
Продукт **ng.app.quota** является незаменимым средством контроля ресурсов на
хостинге и несомненно, найдет большое применение. Он легко настраивается и
подключается к любым компонентам сайта.
