Использование Apache Derby для разработки плагинов Eclipse

Пример использования индексации ресурсов

Узнайте, как использовать индексацию ресурсов и Apache Derby для разработки плагинов к Eclipse. База данных Derby, объединенная с Eclipse, позволяет создать базу данных SQL на стороне клиента и избежать проблем с безопасностью и сетью, таких как неустойчивое соединение или длительные задержки. База данных SQL и интерфейс JDBC обеспечивают простой способ хранения информации и быстрый поиск ранее сохраненных данных.

Илья Платонов, программист и разработчик, Axmor

Илья Платонов (Ilya Platonov) –разработчик программного обеспечения в компании Axmor Software и консультант лаборатории IBM Advanced Technology Solutions (ATS) Lab в Новосибирске (Россия). Он защитил диплом бакалавра (с отличием) в области компьютерных наук в Новосибирском Государственном Университете. За последний год он принял участие в пяти проектах ATS в роли системного архитектора и разработчика.



Артем Папков, проектировщик решений, IBM

Артем Папков (Artem Papkov) на данный момент работает проектировщиком решений в команде IBM Client Innovation Team, которая ведет работу с клиентами и партнерами по внедрению новейших технологий, таких как SOA и Web-сервисы. После окончания Белорусского Государственного Университета Информатики и Радиоэлектроники в 1998 со степенью магистра в области компьютерных наук он поступил в 200 году на работу в IBM, в Research Triangle Park, NC. Артем имеет опыт в разработке многоуровневых решений с использованием новейших технологий, в проектировании и интеграции решений, основаных на интернет-технологиях. Последние три года он работает с клиентами и помогает внедрять Web-сервисы (которые являются стратегической интеграционной технологией IBM) и SOA (интеграционный подход).



Джим Смит, менеджер, IBM

Джим Смит (Jim Smith) имеет более 18 лет опыта в области разработки программного обеспечения. Его карьера началась в Sandia National Labs в Ливерморе, штат Калифорния, с конструирования высокоскоростных систем сбора данных и распределенных компьютерных систем, использующих огромное количество унаследованного кода. Обладая глубоким знанием языка Java и хорошими навыками общения с клиентами, Джим перешел в команду Emerging Internet Technologies, которая занимается реализацией Java-решений для клиентов IBM. Джим является одним из основателей Advanced Technology Solutions (ATS), всемирной организации по разработке и предоставлению услуг в области программного обеспечения, миссией которой является разработка, улучшение и франчайзинг передовых технологий и легковесных бизнес-процессов для IBM, лабораторий разработок, партнеров по бизнесу и клиентов. Результатом деятельности организации является более быстрая адоптация и развертывание стандартных технологий и продуктов IBM. На сегодняшний день Джим руководит этой организацией.



Терри Финч, ИТ-специалист, IBM

Терри Финч (Terry Finch) работает ИТ-специалистом в команде Customer Innovation Team, которая отвечает за основные проекты клиентов, использующие новейшие технологии. С момента поступления на работу (2000 год) Терри успешно завершил множество проектов, использующих IBM WebSphere® Portal, IBM Lotus® Domino®, Java-технологии, XML, Web-сервисы, многофункциональные интернет-приложения и другие. В последнее время Терри занимается технологиями создания полнофункционального пользовательского интерфейса, такими как Macromedia Flex, Laszlo, IBM Workplace Client Technologies (IWCT), а также технологиями Web 2.0, например, Ajax и QEDWiki.



03.03.2008

Apache Derby и плагины Eclipse

Eclipse - это мощная интегрированная среда разработки (IDE), которая поддерживает множество оболочек (framework) для создания графических компонентов пользовательского интерфейса (например, SWT или JFaces) или для работы с данными (например, Eclipse Modeling Framework). Одной из наиболее интересных особенностей среды Eclipse является ее способность к расширению возможностей платформы разработки с помощью создания новых плагинов. В Eclipse есть поддержка разработки плагинов для всех вышеперечисленных и многих других распространенных платформ, включая базу данных Apache Derby.

В этой статье авторы показывают, как использовать индексацию ресурсов с базой данных Apache Derby для разработки плагинов для Eclipse. Встроенная в Eclipse база данных Derby позволяет создать SQL-базу данных на стороне клиента и избежать таким образом проблем с безопасностью или сетью, таких как неустойчивое соединение или длительные задержки. База данных SQL и интерфейс JDBC обеспечивают простой способ хранения информации и быстрый поиск ранее сохраненных данных.

Вы познакомитесь со следующими темами:

  • Интеграция базы данных Derby в платформу Eclipse
  • Управление данными в Eclipse при помощи базы данных Derby
  • Индексация ресурсов с использованием оболочки Eclipse Builder

Начало работы

Чтобы начать использовать базу данных Derby в Eclipse, нужно загрузить плагин Derby для Eclipse. Выберите подходящую ссылку в секции Latest Official Release (последние официальные выпуски). В пакете вы найдете три следующих плагина:

  • Модуль ядра Derby, который обеспечивает поддержку Derby платформой Eclipse
  • Модуль Derby UI plug-in, предоставляющий компоненты пользовательского интерфейса для работы с базой данных Derby в Eclipse
  • Документация к плагину пользовательского интерфейса Derby

Модуль Derby позволяет использовать клиентские и серверные библиотеки Derby. Поэтому вы можете как создать новую базу данных Derby в Eclipse, так и подсоединиться к существующей базе данных. Плагин пользовательского интерфейса (Derby UI plug-in) предоставляет компоненты и средства, которые могут пригодиться при разработке приложения, использующего базу данных Derby. Например, этот модуль позволяет вам установить соединение с существующей базой данных и посылать ей SQL-запросы (см. ссылку в разделе Ресурсы).

Для того чтобы установить эти модули, выполните следующие шаги:

  1. Извлеките файлы из загруженного пакета в каталог с плагинами Eclipse (например, /eclipse/plugins).
  2. Запустите (или перезагрузите) Eclipse и проверьте, что плагины были успешно установлены: нажмите Help > About Eclipse SDK > Plug-in details. Вы должны увидеть в списке плагины Derby, как показано на рисунке 1.
Рисунок 1. Плагины Derby в списке плагинов Eclipse
Плагины Derby в списке плагинов Eclipse

Примечание: Если вы хотите опробовать примеры приложений, которые сопровождают данную статью, вам понадобится по крайней мере модуль ядра Derby (Derby core plug-in).

Простой код для тестирования функциональности плагина для работы с базой данных Derby

Теперь мы можем создать простой плагин для демонстрации работы плагина ядра Derby (core Derby plug-in). Для этого с помощью мастера Eclipse Plug-In Project создайте новый проект с названием sample_derby, основанный на шаблоне Hello World (см. рисунок 2).

Рисунок 2. Мастер создания плагина Hello World в Eclipse
Мастер создания плагина Hello World в Eclipse

Исходный плагин Hello World просто создает элемент меню Eclipse, называющийся Sample Menu, с пунктом меню Sample Action. При нажатии пользователем на этот пункт меню появляется диалог Hello World!. Модуль также позволяет вызывать диалоговое окно из панели инструментов Eclipse. Чтобы посмотреть, как это работает, нажмите на ссылку Run an Eclipse application в окне файлового редактора при открытом файле plugin.xml или вызовите его, нажав на кнопку Run на панели инструментов Eclipse и потом Eclipse application.

Для того чтобы добавить поддержку Derby для только что созданного плагина, необходимо указать зависимость этой конфигурации от модуля Derby Core Plug-in. Это можно сделать, открыв файл plugin.xml в проекте sample_derby и выбрав зависимость от org.apache.derby.core в секции Required Plug-ins (необходимые плагины) закладки Dependencies (зависимости) (см. рисунок 3). После этого ваш плагин сможет использовать классы Derby.

Рисунок 3. Редактор зависимостей плагинов
Редактор зависимостей плагинов

Теперь вы узнаете о том, как управлять простой базой данной Derby при помощи расширенного плагина, который предоставляет простой счетчик записей для таблицы Records локальной базы данных. Эта таблица содержит информацию о том, сколько записей содержится в базе банных. При нажатии на кнопку количество записей увеличивается на единицу и появляется диалоговое окно, в котором показывается текущее количеcтво записей. Для начала откройте файл SampleAction.java, определяющий класс, отвечающий за Sample Action, и создайте новый метод с названием queryRecords. Вам нужно только соединиться с существующей базой данных. Если соответствующая база данных отсутствует, система создаст новую и вернет 0 (см. листинг 1).

Листинг 1. Код инициализации Derby
public class SampleAction implements IWorkbenchWindowActionDelegate {
/* ... несколько строчек кода пропущено... */

/** строка определения драйвера. */
private static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
/** строка определения протокола. */
private static final String PROTOCOL = "jdbc:derby:";
/** строка определения имени базы данных. */
private static final String DATABASE = "sampleDB";

/** SQL-сценарий для создания таблицы Categories. */
private static final String CREATE_TABLE = "CREATE TABLE Records" 
     + "("
     + "quantity int"
     + ")";

/* ...несколько строчек кода пропущено... */

/**
* Соединение с базой данных, добавление новой записи в таблицу Records
* и подсчет общего количества записей в базе данных.
* Если база данных не существует, создается новая.  
*/
private int queryRecords()
        throws SQLException, IllegalAccessException, ClassNotFoundException,
        InstantiationException {

    Connection currentConnection = null;
    System.setProperty("derby.system.home",
        Sample_derbyPlugin.getDefault().getStateLocation().toFile().getAbsolutePath());
    Properties props = new Properties();

    try {
        Class.forName(DRIVER).newInstance();
        currentConnection = DriverManager.getConnection(PROTOCOL 
            + DATABASE, props);

    } catch (SQLException sqlException) {
        //создание базы данных
        currentConnection = DriverManager.getConnection(PROTOCOL 
            + DATABASE + ";create=true", props);
        try {
            Statement s = currentConnection.createStatement();
            try {
                s.execute(CREATE_TABLE);
            } finally {
                s.close();
            }
            currentConnection.commit();
        } catch (SQLException ex) {
            currentConnection.close();
            throw ex;
        }
    }
    return 0;
}

Здесь системное свойство derby.system.home соответствует местонахождению на диске системных файлов Derby. В листинге 1 в системном свойстве указана папка с данными плагина .metadata/.plugins/sample_derby, которая находится в каталоге рабочего пространства.

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

Листинг 2. Показ диалогового окна с информацией
MessageDialog.openInformation(
window.getShell(),
"Sample_derby Plug-in",
"We have " + queryRecords() + " Records in the database");

Заметьте, что метод queryRecords выдает исключения, которые необходимо обработать, используя конструкцию try-catch. При этом показывается диалог с сообщением об ошибке.

После запуска программы Sample Action, вы увидите следующее (см. рисунок 4):

Рисунок 4. Пример приложения в действии
Пример приложения в действии

Далее в приложение нужно добавить запросы INSERT/SELECT. Код, приведенный в листинге 3, просто добавляет новую строчку в таблицу Records, считает и возвращает количество записей. Добавьте следующие строчки в начало Java-файла.

Листинг 3. Объявление запросов Derby
/** SQL-запрос для подсчета количества записей в базе данных	*/
private static final String SELECT_RECORDS_QUERY = 
        "SELECT SUM(quantity) FROM Records";
    
/** SQL-сценарий для добавления новой записи в базу данных    */
private static final String INSERT_RECORDS_QUERY = 
        "INSERT INTO Records (quantity) VALUES(1)";

Теперь добавьте следующий код в конец метода queryRecords.

Листинг 4. Пример использования запросов Derby
int result = 0;
try {
    Statement s = currentConnection.createStatement();
    try {
        s.execute(INSERT_RECORDS_QUERY);
        ResultSet rs = s.executeQuery(SELECT_RECORDS_QUERY);
        if (rs.next()) {
            result = rs.getInt(1);
        }
    } finally {
        s.close();
    }
    currentConnection.commit();
} finally {
    currentConnection.close();
}
return result;

После того, как Eclipse установит соединение с базой данных, он вставит новую запись в таблицу Records, посчитает количество записей в таблице и вернет это число. Таким образом, число записей возрастает каждый раз, когда вы запускаете Sample Action. После нескольких запусков приложения, вы увидите диалог как на рисунке 5:

Рисунок 5. Пример приложения в действии
Пример приложения в действии

Вы получили представление о том, как можно использовать встроенную базу данных Derby с плагином Eclipse. Давайте перейдем к изучению использования плагина для более сложных приложений.


Плагин индексации ресурсов

Возможность индексации ресурсов важна для сред IDE. Чтобы понять почему, вы можете взглянуть на плагин C/C++ Development Tooling (CDT) для Eclipse: Установите его, создайте простой C++ проект с несколькими файлами с исходным кодом и парой команд #include, и попробуйте воспользоваться функцией автозаполнения. Вы увидите, что нахождение всех вариантов для автозаполнения занимает несколько секунд даже для маленького проекта. Более того, эта операция использует все ресурсы Eclipse, что приводит к временному "зависанию" системы.

Эта статья снабжена примером готового к использованию приложения для индексации ресурсов. Приложение проверяет все ресурсы (файлы) проектов в рабочем пространстве Eclipse, которые имеют особый тип (nature), называющийся Sample Nature, определенный плагином (см. раздел Ресурсы для большей информации). Приложение сохраняет информацию о ресурсах в базе данных Derby и имеет представление (view), которое называется Resources View и позволяет осуществлять поиск по файлам.

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

Менеджер пула соединений с источником данных

Поскольку мы соединяемся с базой данных Derby через JDBC, для управления соединениями с базой данных удобно использовать реализацию интерфейса ConnectionPoolDataSource в Derby. ConnectionPoolDataSource всегда поддерживает несколько открытых соединений с базой данных, поэтому не нужно открывать новое соединение всякий раз, когда вы хотите работать с базой данных, что ускоряет процесс. Также, ConnectionPoolDataSource предотвращает конфликты в ситуации, когда приложение открывает несколько соединений с базой данных одновременно.

Мы будем использовать класс PerUserPoolDataSource, который поставляется вместе с JDBC-драйвером Derby. Как показано в листинге 5, мы создаем экземпляр класса EmbeddedConnectionPoolDataSource и определяем экземпляр класса EmbeddedConnectionPoolDataSource как источник данных для пула соединений.

Листинг 5. Инициализация источника данных Derby
/**
* Источник данных, используемый для соединения.
*/
private static PerUserPoolDataSource datasource;

/**
* Инициализируем базу данных и создаем экземпляр источника данных для нее.
*/
public static void initDatasource () {
    EmbeddedConnectionPoolDataSource connectionPoolDatasource;

    connectionPoolDatasource = new EmbeddedConnectionPoolDataSource(); 
    connectionPoolDatasource.setDatabaseName(
        ResourcesIndexerPlugin.getDefault().getStateLocation().
        toFile().getAbsolutePath() + "/resourcesDB");
    connectionPoolDatasource.setCreateDatabase("create");
        
    datasource = new PerUserPoolDataSource();
    datasource.setConnectionPoolDataSource(connectionPoolDatasource);
    datasource.setDefaultAutoCommit(false);
        
    try {
        Connection connection = datasource.getConnection();
        try {
            Statement statement = connection.createStatement();
            // поиск таблицы Resources в базе данных,
            // если не найдена, инициализируем базу данных
            try {
                statement.execute("SELECT 1 FROM  ");
            } catch (SQLException ex) {
                ResourcesDatabaseInitializer.initDatabase(connection);           
            } finally {
                statement.close();
            }
            connection.commit();
        } finally {
            connection.close();
        } catch (SQLException ex) {
            // Обработка ошибок
        }
    }
}

В тестовом приложении, описанном в разделе Пример кода для тестирования функциональности плагина для работы с базой данных Derby, вы использовали системное свойство derby.system.home для того, чтобы задать местонахождение системных файлов Derby. Однако то же самое делает метод setDatabaseName, поскольку путь к системным файлам Derby содержится в имени базы данных. После инициализации источника данных, код, приведенный в листинге 5, проверяет, существует ли в базе данных таблица Resources. Если таблица не существует, вызывается код инициализации базы данных ResourcesDatabaseInitializer, который является экземпяром служебного класса, инициализирующего базу данных. Метод initDatasource вызывается при инициализации плагина Eclipse, таким образом, переменная источника данных инициализирована и может быть использована для работы с базой данных.

Уровень выполнения операций с базой данных

Второй шаг создания плагина для индексации ресурсов - реализация уровня управления базой данных. Этот уровень отвечает за выполнение операций, таких как вставка, удаление и информационные запросы. Листинг 6 содержит пример метода, который добавляет новый ресурс в базу данных Resources.

Листинг 6. Управление данными
/**
* Добавляет запись с ресурсом в базу данных
* Параметр resource - ресурс, который мы добавляем в базу данных
* Выдает SQLException при возникновении ошибки SQL
*/
public static final void addResource(ResourceEntity resource) throws SQLException {
    Connection connection = datasource.getConnection();
    try {
        PreparedStatement s = connection.prepareStatement(
                "INSERT INTO Resources (path, name, project) VALUES(?,?,?)");
        try {
            s.setString(1, resource.getResourcePath());
            s.setString(2, resource.getResourceName());
            s.setString(3, resource.getProjectName());
            s.execute();
        } finally {
            s.close();
        }
        connection.commit();
    } finally {
        connection.close();
    }
}

Этот пример работает с базой данных примитивной структуры и действительно простыми запросами. Реальные же приложения оперируют гораздо более сложными данными, поэтому для достижения значительной производительности, они должны использовать грамотно спроектированные схемы баз данных и SQL-запросы.

Использование компоновщика (builder) для индексации ресурсов

Лучший способ произвести индексацию ресурсов - использовать компоновщик (builder). В Eclipse компоновщики связаны с определенным типом проекта. Каждый раз, когда происходит изменение в проекте (создание, удаление, обновление ресурсов), оно обрабатывается компоновщиками. Компоновщики также выполняют для всего проекта задачи полной пересборки (full rebuild) и очистки (clean).

Для того чтобы добавить в плагин Eclipse поддержку компоновщика, используйте модуль Project Builder и мастер расширения типов Nature extension wizard. Он создает тип проекта и компоновщик, связанный с этим типом. В примере приложения, прилагающегося к статье, тип назван Sample Nature. Чтобы обрабатывать постоянно увеличивающееся количество изменений в проекте, вам нужно реализовать интерфейс IResourceDeltaVisitor (см. листинг 7).

Листинг 7. Пример реализации IResourceDeltaVisitor
public boolean visit(IResourceDelta delta) throws CoreException {
    IResource resource = delta.getResource();

    /* ...здесь пропущено несколько строк кода... */

    switch (delta.getKind()) {
        case IResourceDelta.ADDED:
            DatabaseUtil.addResource(resource);
        break;
        case IResourceDelta.REMOVED:
            DatabaseUtil.removeResource(resource);
        break;
    }

    /* ...здесь пропущено несколько строк кода... */

}

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

После того, как компоновщик будет готов, вы можете добавить Sample Nature в проект для индексации его ресурсов. Этот индекс может быть использован в коде любого приложения Eclipse, для этого нужно вызвать соответствующий метод, который мы обсуждали в разделе Уровень выполнения операций с базой данных.

Тестирование примера приложения

Чтобы протестировать пример плагина, которым снабжена статья, установите его в Eclipse (плагины Derby также должны быть установлены). Затем свяжите тип Sample Nature с желаемыми проектами в вашей рабочей среде. Для этого нужно нажать правой кнопкой на проекте и выбрать пункт меню Add/Remove Sample Nature (Добавить/Удалить Sample Nature). Все ресурсы контролируемого проекта будут немедленно проиндексированы.

Для поиска по индексированным файлам используйте диалог Resource View. Чтобы открыть его, выберите в главном меню Window > Select View > Other, затем найдите в группе Resources Resources View и выберите его. Поиск осуществляется по началам имен файлов, так что вы должны увидеть примерно то, что показано на рисунке 6.

Рисунок 6. Плагин индексации ресурсов в действии
Рисунок 6. Плагин индексации ресурсов в действии

Открыть файл из Resource View можно дважды нажав на него в списке. Окно автоматически не обновляется после изменений в рабочем пространстве, но вы можете сделать это самостоятельно, выбрав Views > Refresh.


Заключение

Eclipse и Apache Derby на сегодняшний день являются хорошо известными проектами с открытым исходным кодом. Платформа Eclipse позволяет создавать различные приложения с графическим интерфейсом пользователя, в особенности IDE-приложения. При помощи Apache Derby можно создать локальную базу данных SQL для любого Java-приложения. И как было показано в данной статье, Eclipse и Derby могут легко использоваться вместе.

Важный пример использования базы данных Derby для разработки плагинов Eclipse - индексация ресурсов. Используя только оболочку Eclipse Builder, вы можете сохранять информацию в базе данных SQL, а потом использовать эту информацию посредством запросов. Так как база данных Derby оптимизирована для SQL-запросов, вы получите значительный выигрыш в производительности при доступе к ресурсному индексу.


Загрузка

ОписаниеИмяРазмер
Примеры проектов для этой статьиsamples.zip173KB

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Information Management
ArticleID=292811
ArticleTitle=Использование Apache Derby для разработки плагинов Eclipse
publish-date=03032008