Всякий раз, когда дело доходит до нестандартных задач, сценарии удобны. В Linux есть сценарии оболочки, GIMP поддерживает Python, современные текстовые редакторы поддерживают макросы. Теперь пользователям Eclipse больше не должно быть стыдно. В созвездии Eclipse.org появилась новая звезда — проект Monkey. Этот новый, но зрелый проект, дает вам возможность автоматизировать и ускорить разработку с помощью сценариев.
Сколько раз вы переходили на shell только для использования команды grep / sed / awk? Как часто у вас возникали идеи относительно новых функциональных возможностей, но сложная архитектура Eclipse мешала вам расширить платформу? Эта статья даст краткий обзор этой новой возможности, представленной широкой аудитории в выпуске Europa (Eclipse 3.3).
Эта статья предполагает от вас, по крайней мере, базовые знания об Eclipse и точках расширения.
Если вам не хватает этих знаний, следующие короткие публикации очень полезны:
Монтаж
Лучший способ начать с Monkey — использовать Eclipse 3.3. Когда вы загрузите копию, запустите ее и используйте сайт обновления для установки проекта. Проверьте Europa Discovery Site > Other Tools > Eclipse Monkey
экран выбора функций (см. Следующий экран)
[Img_assist | NID = 736 | название = | убывание = | ссылка = нет | ALIGN = слева | ширина = 500 | Высота = 495]
Рисунок 1. Проект Monkey — установка
Нажмите кнопку «Выбрать обязательное», если вы видите сообщение об ошибке, которое добавляет необходимые зависимости. Продолжите установку и перезапустите Eclipse, если это необходимо.
После завершения установки взгляните на строку меню, вы должны заметить новый пункт под названием «Скрипты» — здесь доступны все доступные скрипты. Вы можете попробовать один из примеров. Для этого нажмите в меню «Сценарии» и выберите «Примеры». Проект Eclipse Monkey examples создается в вашей рабочей области. Это набор примеров сценариев, созданных для ознакомления пользователей с проектом Monkey. Снова зайдите в меню «Сценарии», на этот раз выберите Hello > Bjorn
пункт. В результате выполнения скрипта отображается всплывающее диалоговое окно с сообщением. Поздравляем! Обезьяна работает.
Анатомия Обезьяны сценарий
Присмотритесь к проекту «Примеры обезьян Eclipse». Когда вы развернетесь, вы увидите папку «scripts» с файлами внутри. Это файлы сценариев — один сценарий на файл. Каждый раз, когда новый скрипт добавляется, удаляется или происходит изменение существующего файла, Monkey перестраивает свое меню. Теперь я объясню структуру скриптов.
Пример, который мы только что запустили, хранится в файле Hello__Bjorn.js. Откройте его в редакторе:
/*
* Menu: Hello > Bjorn
* Kudos: Ward Cunningham & Bjorn Freeman-Benson
* License: EPL 1.0
*/
function main() {
text = "Hello Bjorn\n\n";
text += "The quick brown fox jumped over the lazy dog's back.";
text += "Now is the time for all good men to come to the aid of their country."
Packages.org.eclipse.jface.dialogs.MessageDialog.openInformation(
window.getShell(),
"Monkey Dialog",
text )
}
First thing to notice is JavaScript comment, this is a header. You have to remember thatMenu
field is mandatory. Its content is straightforward: elements separated by > character form menu location, last element is a script name.
[Img_assist | NID = 739 | название = | убывание = | ссылка = нет | ALIGN = слева | ширина = 213 | высота = 154]
Рисунок 2. Местоположение, определенное в заголовке, делает скрипт доступным в меню.
Хотя другие поля заголовка не являются обязательными, это хороший способ добавить Kudos и License.
Функция main
идет после заголовка. Здесь Обезьяна начнет выполнение скрипта. Сначала создается текстовая переменная с сообщением. Затем вы видите ссылку на класс Java: MessageDialog. Это использование концепции Rhino: полное имя класса Java с префиксом Package
ключевого слова. Rhino — один из первых скриптовых движков, который принес JavaScript в мир Java, и он используется в текущей реализации Monkey. window
Ключевое слово переменный обеспечиваются сценарии. Это одна из многих предопределенных переменных, предоставляющая способ взаимодействия с Eclipse. Позже вы узнаете больше об этом, теперь просто предположим, что window
переменная является объектом, предоставляющим доступ к Eclipse workbench ( org.eclipse.ui.IWorkbenchWindow
). window.getShell()
Оболочки метод возвращает Workbench окна —Shell
является концепцией Eclipse, представляющей окно, видимое для пользователя — необходимое для создания MessageDialog
.
Внутренности
После первого укуса Обезьяны пришло время показать вам, как она работает внутри. Посмотрите на следующую диаграмму UML.
[Img_assist | NID = 740 | название = | убывание = | ссылка = нет | ALIGN = слева | ширина = 486 | Высота = 449]
Рисунок 3. UML-диаграмма, представляющая основные элементы Monkey.
Когда платформа Eclipse запускается,
EclipsePlugin
создает меню «Сценарии» и его содержимое, затем регистрирует listener (
UpdateMonkeyActionsResourceChangeListener
), чтобы синхронизировать содержимое меню со сценариями. Пункты меню представлены
MenuRunMonkeyScript
классом, производным от
org.eclipse.jface.action.IAction
. Всякий раз, когда вы выбираете в меню сценарий для запуска, действие получает обработчик сценария из соответствующей
IMonkeyLanguageFactory
реализации и делегирует запрос
IMonkeyScriptRunner
реализации. Помимо создания обработчика сценариев, роль языковой фабрики состоит в том, чтобы понимать заголовок сценария и создавать
ScriptMetadata
объект в результате использования
getScriptMetadata
метода. Вообще говоря
ScriptMetadata
представляет поля, определенные в заголовке. Скрипт-бегун — тот, кто запускает скрипт. На данный момент есть только
JavaScriptRunner
Доступна реализация, позволяющая создавать скрипты Monkey на JavaScript. Другие языки поддерживаются разветвленным проектом GroovyMonkey, о котором я расскажу позже.
DOM
Скрипты были бы бесполезны без возможности взаимодействия с Eclipse. В мире Monkey вы используете DOM — простой Java-объект, доставленный в контекст скрипта. Таким образом, пользователи могут предоставлять любые методы и объекты, которые они хотят. DOM вносятся в Обезьяну через точки расширения. Следующие разделы объяснят детали.
Универсальный ДОМ
Пример лучше всего поможет научить. Давайте создадим простую модель DOM: ExampleDOM
. Там будет только два метода:
package com.onjava.monkey.dom;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Example DOM for use in monkey scripts.
*/
public class ExampleDOM {
private static final SimpleDateFormat dateFormat =
new SimpleDateFormat();
/** Print current date . **/
public void printDateNow(){
System.out.println(dateFormat.format(new Date()));
}
/** Print debug message. **/
public void printDebug(String msg){
System.out.println("DEBUG: "+msg);
}
}
Чтобы сделать этот объект доступным для скрипта, нам нужно реализовать org.eclipse.eclipsemonkey.dom.IMonkeyDOMFactory
интерфейс. Это фабричный интерфейс, в котором реализован только один метод:
public interface IMonkeyDOMFactory {
public Object getDOMroot();
}}
В нашем примере мы хотим вернуть ExampleDOM
экземпляр класса. Он не имеет состояния, поэтому мы всегда можем вернуть один и тот же экземпляр.
package com.onjava.monkey.dom;
import org.eclipse.eclipsemonkey.dom.IMonkeyDOMFactory;
/**
* Simple DOM factory.
*/
public class DOMFactory implements IMonkeyDOMFactory {
private ExampleDOM dom;
public DOMFactory() {
dom=new ExampleDOM();
}
public Object getDOMroot() {
return dom;
}
}Сейчас мы вносим свой вклад
DOMFactory
вorg.eclipse.eclipsemonkey.dom
точку расширения , чтобы сделать скрипт бегуна в курсе нашего DOM. Мы должны предоставить следующие значения:
variableName
— имя, под которым экземпляр DOM будет зарегистрирован в контексте скрипта.class
— Фабрика, которая будет производить DOM.resource
— Имя класса, отражающее класс корня DOM
Вот что входит в plugin.xml:
<plugin>
<extension
point="org.eclipse.eclipsemonkey.dom">
<dom
variableName="example"
class="com.onjava.monkey.dom.DOMFactory"
resource="com.onjava.monkey.dom.ExampleDOM"
>
</dom>
</extension>
</plugin>
Don’t worry if you feel a little bit lost. I made the code above available as a plug-in, try it to fill the gaps in your understanding. There is source and binary distribution available.
Language specific DOM
Apart from generic DOM, JavaScript engine is supporting objects designed to be used with JavaScript. The way how you can contribute them is not too much different from generic DOM contribution. Important thing to know is that DOM contributed to org.eclipse.eclipsemonkey.lang.javascript.javascript_dom
extension point, will be available only to Monkey scripts run by JavaScript engine. It is not a big problem for now as this is the only supported scripting language.
DOM usage and summary
DOM have to be packed as a plug-in an published on an update site in advance to use. The ExampleDOM
is available at this update site: http://monkey.brain-bakery.com/update-site/ as a com.onjava.monkey.dom
plug-in. The reference is established in a script header. Whenever want to use DOM you have to add «DOM» entry. Following is an example with a reference to ExampleDOM
. Please, create new script file ExampleDOM.js and paste following content.
/*
* Menu: OnJava > ExampleDOM
* Kudos: OnJava
* License: EPL 1.0
* DOM: http://monkey.brain-bakery.com/update-site/com.onjava.monkey.dom
*/
function main() {
example.printDateNow
example.printDebug(“This is debug message.â€)
}}
Что сделает Monkey, когда увидит заголовок из предыдущего кода? Попробуйте сами, запустив скрипт. Выберите из OnJava > ExampleDOM
пункта меню «Сценарии» . Вы должны увидеть диалоговое окно с предупреждением об отсутствии DOM.
[Img_assist | NID = 741 | название = | убывание = | ссылка = нет | ALIGN = слева | ширина = 500 | Высота = 171]
Рисунок 4. Диалоговое окно «Missing DOM».
Нажмите «Установить плагин». Предполагая, что выше
ExampleDOM
мы создали ранее, скрипт должен поместить два сообщения в представление консоли: текущая дата и сообщение отладки.
То, что только что произошло, является частью магии Обезьяны. Плагин, который доставляет DOM, может быть загружен и доступен для скрипта, благодаря записи в заголовке. Вот что видит Обезьяна:
- http://monkey.brain-bakery.com/update-site/ — обновить местоположение сайта
- com.onjava.monkey.dom — плагин, который содержит DOM
The plug-in is downloaded from the update site, DOMs are made available in script’s context. This mechanism is not perfect. Be aware of fact there is no support for versioning DOM objects. It may happen that a script will stop working, because of changes in remote DOM.
Now you know how powerful Monkey scripts can be. With proper set of DOM contributions a script can access any part of Eclipse. For your convenience there are some DOM available with Monkey distribution:
- Generic (no need to mention in header)
- resources — org.eclipse.eclipsemonkey.doms.resources.Resources
- workspace — org.eclipse.eclipsemonkey.doms.workspace.WorkspaceDOMFactory
- JavaScript specific (DOM url: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript)
- io — org.eclipse.eclipsemonkey.lang.javascript.doms.io.IO org.eclipse.eclipsemonkey.lang.javascript.doms.io.File wrapper around java.io.File org.eclipse.eclipsemonkey.lang.javascript.doms.io.WebRequest
- resources — org.eclipse.eclipsemonkey.lang.javascript.doms.resources.Resources
- views — org.eclipse.eclipsemonkey.lang.javascript.doms.views.Views
- editors — org.eclipse.eclipsemonkey.lang.javascript.doms.editors.Editors
Your own script
You are ready to write your very first script. Here is the idea: Whenever I’m stuck while coding I use one of code search websites to find examples, related to subject I’m working on. We will use Koders website. These are goals for the script:
- take current editor’s selection as an input
- search at Koders website for selected phrase
- show the result in Eclipse view.
- be available in «Scripts» menu, as
> Search > Google Code
item.
We start with script’s header. This is what we need:
/*
* Menu: Search > Koders
* Kudos: OnJava.com
* License: EPL 1.0
* DOM: http://download.eclipse.org/technology/dash/update/org.eclipse.eclipsemonkey.lang.javascript
*/
Store the script in a file your workspace. Create a new project named "OnJavaMonkey" and new "scripts" folder within. Create new file CodersSearch.js beneath and paste lines above. Go and check "Scripts" menu, similar items should be there:
[img_assist|nid=742|title=|desc=|link=none|align=left|width=270|height=326]
Figure 5. Example script’s location.
Плагин Monkey читает открытые проекты и проверяет папку «scripts». Любой файл с расширением js читается, анализируется и помещается в меню. Скрипт доступен, но не работает. Добавляем функцию
main
:
function main()
{
var sourceEditor = editors.activeEditor;
var range = sourceEditor.selectionRange;
var deleteLength = range.endingOffset - range.startingOffset;
var selection = sourceEditor.source.substring(range.startingOffset,range.endingOffset);
webView = views.getView("KodersWebView");
webView.showView(true);
webView.setTitle("Koders");
webView.url = "http://www.koders.com/default.aspx?btn=Search&la=*&li=*&s="+selection;
}
Now I want you to open a new editor (New > Untitled Text File) and type String.substring
. Select what you have typed and run the script from Search > Koders
; menu.
[Img_assist | NID = 743 | название = | убывание = | ссылка = нет | ALIGN = слева | ширина = 500 | Высота = 324]
Рисунок 6. Результат поиска.
Результат не должен сильно отличаться от того, что вы видите на снимке экрана: список всех вхождений «String.substring» во всем коде, проиндексированном Koders
Обмен скриптами
Скрипты могут быть переданы очень легко. Когда вы публикуете в своем блоге или вики-странице, любой может скопировать и вставить скрипт в свою рабочую область. Вам нужно знать только одно правило. Сценарии должны быть заключены в следующие строки, вдохновленные Jabberwocky:
--- Came wiffling through the eclipsey wood ---
... script goes here ...
--- And burbled as it ran! ---}Как только вы помните это, вы можете поделиться своими сценариями. Для вашего удобства при щелчке правой кнопкой мыши на скрипте в навигаторе проекта доступно меню «Копировать для публикации».
[Img_assist | NID = 744 | название = | убывание = | ссылка = нет | ALIGN = слева | ширина = 460 | высота = 182]
Рисунок 7. Публикация скриптов стала проще.
Возможно, вы захотите проверить следующую площадку скриптов:
http://monkey.brain-bakery.com/ . Это веб-сайт, на котором вы можете легко публиковать свои работы и искать в других материалах.
GroovyMonkey
GroovyMonkey — это разветвленный проект, начатый Джеймсом Эрвином в мае 2006 года. Первоначально проект был создан для тестирования поддержки многих дополнительных языков: BeanShell, Python, Groovy и Ruby. Сегодня это больше похоже на тестовую площадку для будущих функций, вот некоторые из них:
- вклад в контурный вид, дающий вам удобный вид дерева со списком объектов, доступных в ваших скриптах
- расширенные поля заголовка, дающие вам больший контроль над выполнением скрипта (например, вы можете пометить ваш скрипт как UI Job)
- дополнительные деревья DOM
[Img_assist | NID = 745 | название = | убывание = | ссылка = нет | ALIGN = слева | ширина = 500 | высота = 338]
Рисунок 8. GrooveMonkey в действии.
Набор функций GroovyMonkey — это нечто большее, чем просто несколько настроек, это заслуживает отдельной статьи. Это, безусловно, проект, который вы хотите попробовать. Просто не забудьте удалить или отключить Monkey перед началом установки GroovyMonkey.
Резюме
Как я уже упоминал в начале, проект все еще развивается. Чтобы быть в курсе последних изменений, вам следует взглянуть на источники. Установить их проще, чем вы думаете. Перейти на домашнюю страницу проекта и проверить.
Now when you are familiar with the Monkey, it is the time to start creating your own scripts. You have learned script’s syntax and concept of DOMs contribution and sharing. This knowledge enables you to make development more productive. Start making your life easier and remember to share your scripts with others.
Resources
- The Monkey Project homepage
- Groovy Monkey homepage: http://sourceforge.net/projects/groovy-monkey
- The Scripts Marketplace: http://monkey.brain-bakery.com
- Example DOM — com.onjava.monkey.dom:
- Rhino project page: http://www.mozilla.org/rhino/scriptjava.html
- Find yourself a JavaScript editor: