Мій перший Eclipse-плагін

Вітаю, дорогі хаброчитатели!
Деякий час тому мені випала цікава задача — написати плагін для Eclipse. Причому плагін не простий, а з хитрим задумом.
Досвіду написання плагінів для Eclipse у мене ніколи не було, але треба — так треба, а що з цього вийшло — під хаброкатом.

Хитра задумка формулювалася так(точна цитата):
«Eclipse існує поняття launch-конфігурацій — налаштувань запуску проектів з workspace'а. Ці launch-конфігурації мають різні властивості в залежності від типу запускаються додатків (java-додаток, Eclipse plugins, JUnit-тести).
Іноді виникає потреба запускати кілька додатків з одного workspace'а — наприклад, ми пишемо клієнт-серверний додаток і хочемо одночасно запускати і сервера, і клієнта. Для таких цілей було б зручно мати новий тип launch-конфігурацій — composite, який би дозволяв створювати нову конфігурацію, що посилається на існуючі. При цьому при запуску цієї композитної конфігурації повинні запускатися всі конфігурації, на які вона посилається. Завдання — реалізувати eclipse-plugin('s), додають таку нову launch-конфігурацію.»
Отже, отримавши і зрозумівши цю задачу, я почав з того, що робить будь-який нормальний чоловік при вирішенні завдання — декомпозиція задачі.

Велика декомпозиція


Ну по-великому рахунку мені треба: плагін-раз, як зробити launch-конфігурацію — два.

Плагін


Моїй відправною точкою для розробки плагіна були ось ці дві статті:
Прочитавши статті я скачав інструментарій, на якому буду ліпити плагін.
Качав тут: https://www.eclipse.org/downloads.
Качати треба не що попало, а той, що містить «Plug-in Development Environment».
Завантажили — запускаємо.
Тиснемо File- > New-> Project-> Plagin project
У віконці, що з'явилося(малюнок нижче) тиснемо Next



З'явиться віконце:



У ньому вбиваємо стандартні параметри і тиснемо Next.
З'явиться віконце:



Тут теж все досить стандартно, АЛЕ необхідно звернути увагу на криж «This plug-in will make contributions to the UI» — його прибираємо, якщо UI не потрібен і наборот. Тиснемо Next.
З'явиться таке віконце:



Тут можете вибрати шаблон плагіна, а я просто отщелкнул криж вверку і натиснув Finish.
В результаті проект плагіна буде створений і з'явиться на екрані щось подібне:



Тут ми можемо на вкладці Dependencies додати різні залежно плагіна, а файл plugin.xml грає дуже важливу роль у розробці плагіна.
Отже, як зробити плагін ми розібралися.
Далі нас цікавлять launch-конфігурації і з чим їх їдять.

Launch-конфігурація


Отже, що за звір launch-конфігурація? По-суті це просто конфігурація запуску програми.
Тобто настроювання параметрів з якими буде працювати програма.
Детальніше про це можна почитати тут: http://wiki.eclipse.org/FAQ_What_is_a_launch_configuration%3F
Як зробити launch-конфігурацію описано тут: http://www.eclipse.org/articles/Article-Launch-Framework/launch.html

Повернемося до задачі


Отже, як ліпити плагін та launch-конфігурацію стало зрозуміло.
Почнемо.
Ми зробимо два плагіна:
  • andrey.compositelaunchconfig — тут буде власне все що треба, для того щоб запустити кілька launch-конфігурацій. Але без UI. У статті наведеної вище, пишуть, що краще так розділити власне логіку і UI, раптом комусь захочеться запустити якось хитро це добро, і UI йому не потрібен.
  • andrey.compositelaunchconfig.ui — тут буде власне ui цієї справи.
Прочитавши те, що в ссылочках, наведених вище, Кеп какбе натякає, що треба б для реалізації launch-конфігурації заимплементить інтерфейс ILaunchConfigurationDelegate.
Не будемо соромитися і заимплементим інтерфейс:

public class CompositeLaunchConfigurationDelegate implements ILaunchConfigurationDelegate {

private void launchInnerConfiguration(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {

ILaunch configurationLaunch = configuration.launch(mode,monitor);
for (IDebugTarget debugTarget : configurationLaunch.getDebugTargets()) {
launch.addDebugTarget(debugTarget);
}
for (IProcess process : configurationLaunch.getProcesses()) {
launch.addProcess(process);
}
}

@Override
public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {

if(!Utils.isLaunchModeValid(mode))
throw new CoreException(new Status(IStatus.ERROR,Activator.getPluginId(),"launch mode is not valid"));
if(!Utils.isConfigurationValid(configuration))
throw new CoreException(new Status(IStatus.ERROR,Activator.getPluginId(),"configuration is not valid"));
try
{
List<ILaunchConfiguration> launchConfigurations = Utils.getInnerConfigurations(configuration);
SubMonitor launchMonitor = SubMonitor.convert(monitor, configuration.getName(), launchConfigurations.size());
for (ILaunchConfiguration launchConfiguration : launchConfigurations) {
if (!monitor.isCanceled()) {
launchInnerConfiguration(launchConfiguration,mode,launch,launchMonitor.newChild(1));
}
}
}
finally{
monitor.done();
}
} 

}


Паралельно ми зробимо функціональність, яка буде дозволяти перевірити, що композитна конфігурація не зациклилася(ато візьме якийсь злий дядько і зробити конфігурацію, яка буде посилатися на саму себе, а так ми його — опа по руці:))

Робимо UI


C UI-ним плагіном все досить просто.
1.Нам треба зробити закладку, яка буде містити налаштування.
Для цієї нас можна унаследоваться від класу AbstractLaunchConfigurationTab.
2. Зробити групу закладок, для цього нам треба унаследоваться від класу AbstractLaunchConfigurationTabGroup.
Разом
В результаті всіх цих нехитрих маніпуляція вийшла ось така штука:



Зліва всі доступні конфігурації, а праворуч ті, які будуть запускатися.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.