Как работает Automator

 

Архитектура загружаемых Bundle-пакетов

Приложение Automator основано на архитектуре загружаемых bundle-пакетов. Он загружает загружаемых пакеты вызывает действия и выполняет код, который содержится в последовательности определяемий текущим рабочим процессом, переводя потоки данных от одного действия к другому.

Каждое действие упаковано как загружаемый пакет или в случае AppleScript действия, основанные на потенциально загружаемых пакетах. Загружаемый пакет содержит ресурсы различных видов и обычно двоичный код, но он не способен выполнять этот код сам по себе. Внутренняя структура Cocoa bundle-пакетов представлена в форме, которая "понимает" NSBundle объект. Использование NSBundle объекта, приложением или библиотекой может загрузить ресурсы и код загружаемых пакетов во время выполнения и интегрировать их с тем кодом, который оно уже содержит. Загружаемые bundle-пакеты по существу имеют архитектуру плагинов.

Когда он запускается, Automator немедленно сканирует установленные действия пакета и извлекает из информационного списка свойств каждого пакета (Info.plist) информацию, необходимую для его отображения и подготовки его к использованию. Automator действия (в виде загружаемых пакетов) хранятся в стандартных местах файловой системой:

/System/Library/Automator - Предоставленные Apple действия
/Library/Automator - Прочие действия для всех пользователей
~/Library/Automator - Прочие действия для текущего пользователя

Automator также ищет действия, которые хранятся внутри bundle-пакетов любых зарегистрированных приложений.

Когда он запускается, Automator также загружает любой Mach-O код, который он находит в пакете-действия, который в данном случае является Objective-C-действием только разрешенных внешних ссылок в этом процессе. Если действие основано на Objective-C, экземпляр AMBundleAction (или подкласс этого класса) разархивируется из nib. Тем не менее, если действие полностью построено на AppleScript или сценарии оболочки, Automator вместо этого сохраняет ссылку на пакет, так как нет Mach-O кода для загрузки. Когда пользователь перетаскивает такое действие в область рабочего процесса Automator в первый раз, приложение загружает действие, его nib файл распаковывается, и отображает вид действия.

Новый рабочий процесс

Когда пользователь создает новый рабочий процесс путем перетаскивания одного или нескольких действий в макет рабочего процесса, Automator делает несколько вещей:

Если действие основано на AppleScript он создает экземпляр AMAppleScriptAction как владелец пакета, и также загружает сценарий так AppleScript Studio может выполнить некоторую инициализацию. Если действие основано на сценарии оболочки, Automator, вместо этого, создает экземпляр AMShellScriptAction.

Он получает представление содержимого, содержащегося в пакете действия и отображает его в виде действия в области рабочего процесса, устанавливая значения по умолчанию для текстовых полей и элементов управления, как это определено в AMDefaultParameters свойстве действия.

Извлечение из архива рабочего процесса

При сохранении рабочий процесса или копировании его через буфер обмена, рабочий процесс и все его действия архивируются. Automator вызывает метод writeToDictionary: каждого из действий в рабочем процессе, направляемым в изменяемый словарь с параметрами действия и другой информацией. Действие может выбрать модификацию содержимого словаря перед возвращением из writeToDictionary:. Затем объединенные словари каждого действия рабочего процесса кодируются и архивируются.

Когда Automator читает архив рабочего процесса с диска или буфера обмена, он посылает initWithDefinition:fromArchive: сообщение для каждого действия в рабочем процессе. В первом параметре сообщение представляет собой словарь, из которого действие может воссоздать свое состояние, в частности, последнего выбранного параметра. Второй параметр сообщает вновь созданному объекту действия его определение из архива.

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

Программные последствия загружаемых пакетов

Доступ к Bundle-пакету

Один из вопросов, с пакетами возникает из различий между основными пакетами таких приложений, как Automator и пакетами, которые загружаются приложениями. Если вы запопросите главный пакет в вашем коде действия, например:

NSBundle *theBundle = [NSBundle mainBundle];

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

NSBundle *theBundle = [self bundle];

Метод bundle объявлен в AMBundleAction классе, все действия которого наследуются из класса, прямо или косвенно

Разархивирование nib файла

Cocoa программы часто реализуют метод awakeFromNib (его коллега в AppleScript обработчик команды awake from nib). Метод awakeFromNib вызывается, когда все объекты nib файла программы были разархивированы. Это дает программе возможность выполнить инициализацию, которая требует присутствия всех извлеченных из архива объектов.

Однако метод awakeFromNib вызывается, когда Automator будет запущен. В это время Automator читает любой двоичный код действия в стандартных местах Automator и непосредственно разархивирует объекты в nib файлах, которыми он напрямую владеет. Тем не менее, эти объекты не включают в себя объекты в nib файлах действий. nib файл действий не загружен и его объекты не разархивированы пока пользователи не перетащат действие в рабочем процессе. Если вы хотите выполнить инициализацию, которая требует присутствия всех объектов и связей в nib файле действия, реализуйте метод opened вместо awakeFromNib.

Пространство имен

Objective-C класс определяет пространство имен для методов и переменных экземпляра, которые он объявляет. В связи с этим одноименные методы и переменные в других классах не вызывают конфликты в процессе. Однако имя самого класса существует в пространстве имен, занимаемом всеми классами, загруженных процессом. Кроме того, все глобальные символы (например, функции и типы данных) также находятся в одном и том же пространстве имен в процессе.

Для Automator, с его архитектурой загружаемых пакетов (или плагинов), потенциальна вероятность конфликтов имен, а, следовательно вероятность -исключений во время выполнения является значительной. Automator потенциально может загрузить сотни действий из разных источников и, например, если два класса действия имеют одинаковые имена или объявляют строковую константу с тем же именем, есть потенциал для конфликта имен, когда эти действия, загружаются Automator.

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

Потоковая архитектура

Для повышения стабильности и выполнения дают AppleScript действия, основанные на доступе к таким ресурсам, как Standard Additions, Automator имеет потоковую архитектуру, которая ставит различные виды программной деятельности в отдельные потоки. Automator запускает рабочий процесс на вторичном потоке (то есть, поток, отличный от основного потока). Но, он запускает каждое действие в различном потоке в зависимости от того, основано действие на AppleScript или Objective-C:

  • Если действие основано на AppleScript, оно выполняется в главном потоке. Реализация позволяет пользователям отменить выполнение действия на этом потоке, нажав кнопку остановки.
  • Если действие основано на Objective-C или сценарии оболочки, она выполняется на вторичном потоке.

Эта потоковая архитектура накладывает ограничения на оба способа написания действий, как на основе AppleScript, так и Objective-C . Если действие на основе AppleScript использует команду do shell script, пользовательский интерфейс не отвечает, пока сценарий не завершится; единственный способ, которым пользователи могут отменить выполнение, это нажать Command-period. Если Objective-C действия отображают окна, они должны сделать это в главном потоке используя такой метод, как performSelectorOnMainThread:withObject:waitUntilDone:.

Классы Automator

Automator как технология включает в себя не только приложения и его действия, но и Automator библиотеку (Automator.framework). Библиотека реализует большую часть общего поведения действий, а также обеспечивает общий интерфейс, который определяется четырьмя классами: AMAction, AMBundleAction, AMAppleScriptAction и AMShellScriptAction. Эти классы являются иерархически связанными (с точки зрения наследования), как показано на рисунке ниже.

Классы Automator

AMAction это абстрактный класс, который определяет интерфейс и приписывает важное значение для всех действий. Главный атрибут действия (как определено AMAction) является его определение, словарь, производный от свойств, указанных в информационном списке свойств bundle-пакета. Назначенный инициализатор AMAction включает определение действий в его сигнатуре: initWithDefinition:fromArchive:. Основным методом в программный интерфейсе действия (как определено AMAction) является runWithInput:fromAction:error:, который кратко описан в "Архитектура загружаемых Bundle-пакетов".

AMBundleAction класс непосредственно наследуется от AMAction и обеспечивает конкретную его реализацию. AMBundleAction определяет интерфейс и общее поведение действий, которые являются загружаемыми пакетами. AMBundleAction объекты имеют три основных свойства:

  • Соединение на выходе к связанным с ними видами
  • Ссылка на их bundle-пакет
  • Параметры действия, то есть конфигурации выбора пользователя, сделанные в пользовательском интерфейсе действия (хранится в NSDictionary объекте).

Bundle-пакетным действиям, разработанным с представлениями видов, доступны ресурсы пакета и доступны параметры для действия. Они расширяют загружаемые пакеты действий так, чтобы скрипты AppleScript или скрипты могли управлять логикой действия, вместо Objective-C кода (хотя AppleScript, Objective-C, и даже скрипт оболочки код может быть смешан в реализации действия). Единственным выходом AMAppleScriptAction является OSAScript объект, представляющий сценарий, по умолчанию этот выход установлен на объект, представляющий main.applescript.

Вы можете создать свои собственные подклассы на последних двух уровнях иерархии классов Automator, то есть на AMBundleAction вниз, чтобы получить объекты с характеристиками и возможностями, как вам нужно. Если вы хотите создать загружаемый bundle-пакет действия, поведение которого определяется языком сценариев отличным от AppleScript, Perl, Python, сценарий оболочки, вы бы создали подкласс AMBundleAction.

Концептуально, два основных внешних факторов для действия являются входными объектами, переданными ему на рассмотрение от предыдущего действия (если таковые имеются) и параметры, указанные пользователями с помощью элементов управления и текстовых полей вида действия. Экземпляру AMBundleAction доступен входной объект в его реализации runWithInput:fromAction:error: и получает параметры непосредственно из пользовательского интерфейса через механизм Cocoa bindings. Для действий на основе AppleScript (представленных например AMAppleScriptAction), входные параметры объекта еще более явные. Они встречаются в виде переданных значений в обработчик on run, как показано на рисунке ниже:

Automator on run
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac