Во время собеседования, если кто-то спросит вас, какую IDE вы бы предпочли, скорее всего, ваш ответ будет затмением. Если вас спросят почему, то, как и любой, кто является разработчиком среднего уровня, вы бы ответили, как eclipse расширяем, как он поддерживает плагины, насколько он продуктивен … и т. Д. Но так мало из тех, кто выше среднего уровня, занимаются программированием Плагины, хотя это и весело, и легко.
Когда я впервые заинтересовался разработкой плагинов для Eclipse, я поискал учебники и примеры. Тем не менее, я закончил со многими примерами привет мира, которые выскакивают сообщения или другие действия, которые вы, вероятно, не захотите делать в плагине. Так вот пример реального (не привет) мира за 2 минуты.
Когда я был ребенком, моими любимыми игрушками были мои строительные блоки lego. Раньше у меня был звездный флот с несколькими станциями над домом. Все компоненты lego открыты для расширения. Грузовая единица может быть добавлена к точке расширения звездолета, добавляя грузовые возможности, и эта грузовая единица все еще может позволить кораблю состыковаться с док-станцией. Система довольно проста, и в мире есть небольшая выпуклость или отверстие, которые подходят друг другу.
Eclipse не сильно отличается, во вселенной Eclipse IDE предлагает несколько точек расширения, которые вы можете подключать и взаимодействовать с экосистемой Eclipse. Тем временем вы также можете позволить другим использовать ваши точки расширения для взаимодействия с вашим плагином или другими плагинами, с которыми вы взаимодействовали. Eclipse SDK имеет более 200 точек расширения, которые вы можете найти в документации по Eclipse. Однако это может быть немного запутанным в начале. К счастью, Eclipse предлагает несколько мастеров для создания базовых плагинов на наиболее часто используемых точках расширения.
Eclipse работает на реализации OSGi под названием Equinox. Равноденствие — это секрет, скрываемый под капотом, как много расширений и плагинов могут работать вместе в координации. Вкратце, технология OSGi обеспечивает сервис-ориентированную платформу на основе плагинов для разработки приложений.
Как я уже говорил, это не будет приложением Hello World. Таким образом, чтобы иметь плагин реального мира, нам нужна проблема реального мира. Если вы когда-либо разрабатывали многоязычные приложения, вы могли заметить, что некоторые языки имеют нестандартные символы, что может стать проблемой в ваших ресурсах. Хотя я уже использовал отличный плагин для пакетов ресурсов, моя текущая компания хочет организовать пакеты ресурсов в алфавитном порядке по значению, а не по ключу. Тем не менее, текущий плагин пакета ресурсов организуется в соответствии с ключом. Поскольку мы не можем использовать этот плагин, у каждого разработчика были разные способы конвертации этих символов. У одного была HTML-страница с Javascript, у другого — приложение на Swing, у другого — где-нибудь, где он может найти, вставил значения Unicode.
Чтобы облегчить жизнь всем, давайте создадим плагин для этой проблемы. Наша цель — взаимодействовать с файлом свойств пакета ресурсов, как только он будет сохранен, и проверять содержимое, заменяя нестандартные буквы значениями Юникода и, наконец, сохранять файл.
** Внимание, описанный ниже метод, возможно, не самый эффективный и лучший алгоритм, но быстрое и простое решение для ежедневной проблемы и базовое руководство для плагинов Eclipse. **
Чтобы создать плагин, нам нужно найти точки расширения, которые нам нужны. К счастью, у eclipse есть несколько шаблонов плагинов, которые используют некоторые наиболее распространенные точки расширения. Все, что нам нужно, это просмотреть и найти его, а затем изменить код в соответствии с нашими потребностями.
Сначала давайте откроем новый проект плагина.
Введите имя для проекта и выберите версию Eclipse.
Введите информацию о содержимом плагина и нажмите «Далее». Вот список готовых шаблонов для плагинов. Просматривая список, вы заметите, что каждый шаблон использует разные точки расширения для включения разных видов взаимодействия с IDE. Существует один шаблон под названием «Плагин с инкрементным компоновщиком проекта», который фактически регистрирует компоновщик для проекта и проверяет файл, что на самом деле и является нашей целью.
Далее введите информацию о плагине и компоновщике и нажмите Готово.
Если вы перемещаетесь по сгенерированным файлам, вы обнаружите четыре класса, и, изучив код, вы поймете, что ResourceBundleBuilder — это тот, который запускается для проверки файла.
Сначала нам нужно найти, где файл обрабатывается. В строке 126 ResourceBundleBuilder.java мы находим метод, отвечающий за проверку xml.
void checkXML(IResource resource) {
if (resource instanceof IFile && resource.getName().endsWith(".xml")) {
...
Все, что нам нужно, это отредактировать этот метод для обработки наших файлов свойств, чтобы изменить символы. Давайте удалим весь код внутри этого метода и заменим его следующим:
void checkXML(IResource resource) {
if (resource instanceof IFile && resource.getName().endsWith(".properties")) {
IFile file = (IFile) resource;
changeTrChars(file);
}
}
Этот код будет обрабатывать файл, только если расширение файла «свойства», и отправит файл в метод changeTrChars.
Теперь нам нужно прочитать содержимое файла, изменить символы и затем сохранить его.
private void changeTrChars(IFile file) {
InputStream is = null;
DataOutputStream out = null;
try {
is = file.getContents();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
String finalLine = "";
while ((line = reader.readLine()) != null) {
//concanate the lines
finalLine += line + "\n";
}
//we are done with the input stream
is.close();
//convert chars
String toOut = convertTr(finalLine);
//if any chars have been changed
if (!toOut.equals(finalLine)) {
File fileTo = new File(file.getProject().getLocation().toPortableString() + "/" + file.getProjectRelativePath().toPortableString());
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileTo)));
//save the file
out.writeBytes(toOut);
out.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
В этом методе мы читаем строку из inputStream, которую мы получаем из файла. Затем отправьте строку в метод convertTr для изменения символов и, наконец, если строка изменилась, мы сохраняем в том же файле. Так как мы работаем над одним и тем же файлом, мы закрываем входной поток всякий раз, когда закончим, чтобы иметь возможность использовать outputStream для одного и того же файла.
Следующий метод — convertTr, который отвечает только за замену символов в строке значениями Юникода.
private String convertTr(String nativeText) {
Map charMap = new HashMap();
charMap.put("ç", "\\\\u00e7");
charMap.put("Ç", "\\\\u00c7");
charMap.put("ğ", "\\\\u011f");
charMap.put("Ğ", "\\\\u011e");
charMap.put("ş", "\\\\u015f");
charMap.put("Ş", "\\\\u015e");
charMap.put("ı", "\\\\u0131");
charMap.put("İ", "\\\\u0130");
charMap.put("ö", "\\\\u00f6");
charMap.put("Ö", "\\\\u00d6");
charMap.put("ü", "\\\\u00fc");
charMap.put("Ü", "\\\\u00dc");
String asciiText = "";
if (nativeText != null) {
asciiText = new String(nativeText);
Set keySet = charMap.keySet();
Iterator it = keySet.iterator();
while (it.hasNext()) {
String nativeChar = (String) it.next();
String asciiChar = (String) charMap.get(nativeChar);
asciiText = asciiText.replaceAll(nativeChar, asciiChar);
}
}
return asciiText;
}
Поскольку наш код готов, мы можем убрать ненужные коды. мы изменили шаблон из xml в ридер свойств, чтобы мы могли удалить все, что касается xmls. Сначала удалите внутренний класс XMLErrorHandler. Также удалите parserFactory, маркерные методы и, наконец, метод getParser.
Остальная часть кода в этом классе отвечает за мониторинг проекта и запуск кода при любых изменениях. Класс ResourceBundleNature — это класс, который регистрирует и включает наш плагин в качестве компоновщика для желаемого проекта. Класс ToggleNatureAction — это aclionListener для щелчка правой кнопкой мыши в меню, который добавляет характер компоновщика в проект. Все эти классы используют точки расширения для взаимодействия с пользовательским интерфейсом и средой Eclipse IDE. Вы можете изучить остальную часть кода, чтобы увидеть, как работают точки расширения, и узнать о них больше, но этот шаблон позволил нам создать нужный плагин всего за 2 минуты.
Просто щелкните правой кнопкой мыши по вашему проекту плагина и запустите его как приложение Eclipse.
Появится новый экземпляр Eclipse с включенным плагином. Вы можете открыть новый проект и включить природу правой кнопкой мыши (добавить природу). Если вы просто напишите что-нибудь в файле свойств этого проекта, вы увидите, что ваш плагин работает и преобразует данные символы в юникод. Когда вы закончите тестирование, щелкните правой кнопкой мыши и экспортируйте ваш плагин и скопируйте в папку плагинов любую установку Eclipse, на которой вы хотите запустить.
Конечно, приятно знать, как Equinox и точки расширения работают в деталях, но это не повод не знать, чтобы не кодировать плагины. Как видите, вы можете разрабатывать плагины, даже не зная секретов платформы. Просто найдите подходящий вам шаблон и, когда вы закончите, изучите сгенерированный код. Так что в скором времени вы также освоите то, что находится под капотом.
Позже я постараюсь опубликовать более подробную информацию о точках расширения, так что следите за обновлениями …