суббота, 30 января 2010 г.

Используем Hibernate в OSGi-среде


В предыдущем посте суровый челябинский программист обещал рассказать про особенности использования Hibernate в OSGi-среде. Точнее в среде Equinox. Чтож, приступим.

Прежде всего давайте разберемся с тем, что мы хотим. Будем исходить из следующих требований:

1. Нам нужен отдельный бандл, который инкапсулирует в себе hibernate, необходимые для его работы библиотеки и какие-то средства инициализации.

2. Все дополнительные средства (c3p0, jdbc-драйвера, oscache, hibernate.cfg.xml) выносим в отдельные фрагментные бандлы. Это позволит заменять используемые средства при необходимости (например, вместо oscache использовать ehcache).

3. Хибернейтовская сессия должна быть доступна любому бандлу, импортирующему бандл с hibernate, поэтому мы ее выносим в сервис.

4. Каждый бандл, использующий хибернейт, должен иметь возможность зарегистрировать мэпинги для своих сущностей. Для этого бандлы будут выставлять свои собственные реализации соответствующего сервиса.

5. Должна быть реализована опциональная поддержка мэпинга на основе hibernate-annotations, т.е. должен быть реализован отдельный бандл, который инкапсулирует hibernate-annotations и ejb3-persistence, а также позволяет регистрировать аннотированные классы.

6. Все используемые сервисы определить как декларативные, что позволит прозрачно разрешить проблему запуска бандлов в нужном порядке.

С требованиями разобрались, приступим к реализации. Создать бандл, инкапсулирующий хибернейт довольно просто - достаточно создать в бандле каталог lib и поместить туда следующие библиотеки:

- cglib-nodep.jar
- dom4j.jar
- hibernate3.jar
- jta.jar

Внимание: я описываю ситуацию для Hibernate 3.2.0 GA. Насколько я знаю, в новых версиях Hibernate есть изменения, в частности, касающиеся логера. Впрочем, эти изменения непринципиальны

пятница, 29 января 2010 г.

"Дружественные" бандлы или еще немного о расширении classpath в OSGi-приложениях


Продолжаем тему решения проблем с загрузкой классов в OSGi-приложениях. Рассмотрим такую ситуацию: у нас есть бандл A, где-то внутри которого используются классы из других бандлов. Причем, используются они по-разному, в том числе и производится загрузка этих классов по имени. Чтобы класс можно было загрузить, он должен присутствовать в classpath (подробнее про загрузку классов я писал в статье Пишем свой загручик java-классов). Classpath бандла формируется из двух частей: классы, присутствующие в самом бандле (задаются директивой Bundle-ClassPath) и классы, импортируемые из других бандлов (задаются директивами Import-Package и Require-Bundle). Так вот, проблема такая: мы хотим расширять возможности бандла A с помощью других, которые предоставляют ему свои классы. По понятным причинам мы не можем каждый такой дополнительный бандл добавлять в Import-Package/Require-Bundle бандла A. Вопрос: как быть?

Кстати, вы уже поняли к чему я клоню? Именно так используется Hibernate: есть один бандл, который содержит внутри себя Hibernate и какие-то механизмы его инициализации, а другие бандлы этот Hibernate используют. Но! Чтобы использовать Hibernate, он должен иметь возможность загружать классы сущностей, используемые в мэпингах и HQL-запросах. Понятно, что не хочется добавлять каждый бандл, использующий Hibernate в манифест хибернейтовского бандла, т.к. это убивает всю идею. модульности.

понедельник, 25 января 2010 г.

Расширяем ClassPath бандла с помощью фрагментов (на примере логирования)


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

Давайте рассмотрим следующую ситуацию: мы хотим использовать в нашем OSGi-приложении логирование с помощью log4j. Ситуация, кстати, не такая уж и редкая. В проект Orbit входит бандл org.apache.log4j, который инкапсулирует данную библиотеку и экспортирует ее packages. По идее, достаточно добавить данный бандл как зависимость (через Require-Bundle или Import-Package) и наслаждаться жизнью, но не тут то было. Дело в том, что log4j нужно конфигурировать, т.е. в корне classpath должен находиться файл log4j.properties, с примерно таким содержимым:

вторник, 19 января 2010 г.

Немного подробнее о проекте CaffeineIM и ICQLib


Здравствуйте, уважаемые читатели. Сегодня немного необычный пост: Суровый программист будет рассказывать не о том, что сделано другими, а о том, чем иногда занимается он сам. Конкретнее - речь пойдет о написанной исключительно Just for fun Java-библиотеке, предназначенной для создания ICQ-клиентов.

Библиотека называется ICQLib и ее исходники можно невозбранно взять на Google Code. В 2007-м году был сделан форк мертвой на тот момент JOscarLib, возможности которого были существенно расширены и добавлена работа с русским языком (в кодировках UTF-8/cp1251). Кстати, злая ирония судьбы: примерно год назад JOscarLib начал развиваться, а работа над нашей библиотекой заглохла (энтузиазм иссяк), но сейчас я решил возродить проект и продолжить работу над ним.

На текущий момент ICQLib обладает следующими возможностями:

- Дополнительные статусы QIP (депрессия, на работе, дома и т.д.)

- X-статусы. Полная реализация, аналогичная возможностям QIP.

- Корректная поддержка русского языка. Подразумевается: отправка-прием сообщений, содержащих кирилицу, информация о себе на русском, информация о контактах, запрос авторизации, x-статусы.

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

- Работа с мета-информацией. Реализованы все запросы метаинформации о контакте (About user).

воскресенье, 10 января 2010 г.

Как подключить Samsung i5700 (Spica) к Linux


По просьбам читателей публикую краткую инструкцию о том, как подключить Samsung i5700 (Spica) к компьютеру под управлением операционной системы GNU/Linux.

Данный процесс имеет два аспекта:

1. Подключаем телефон как флеш-накопитель
После подключения телефона к компьютеру с помощью переходника MicroUSB -> USB на панели уведомлений телефона появится надпись Подключение USB, которая затем пропадет и на панели останется только иконка USB-подключения. После этого можно войти в уведомления и выбрать Подключение USB. Появится диалоговое окошко с вопросом разрешить ли монтирование флеш-карты телефона. После нажатия кнопочки Монтировать телефон будет доступен как внешний флеш-накопитель. Файловая система флешки - FAT 32, поэтому ядро должно быть собрано с поддержкой данной системы.

Для упрощения процесса существует программа MountUSB, скачать которую можно отсюда.

Еще один момент. В отличие от подключения телефона к Windows-машине, галочка в настройках Сведения о телефоне -> Дополнительные параметры -> Запоминающее устройство может быть отключена.

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

1. Отключить в настройках телефона галочку Сведения о телефоне -> Дополнительные параметры -> Запоминающее устройство.

2. Включить в настройках телефона галочку Приложения -> Разработка -> Отладка USB.

3. Скачать патченный adb версии от июля 2009-го года по ссылке. Вообще, его делали для Galaxy, но он подходит и для Spica. Патченный adb можно поместить в <android-sdk>/tools/, предварительно сохранив имеющийся.

4. Создать файл /etc/udev/rules.d/51-android.rules с содержимым:

SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"

Данный файл нужно сделать исполняемым (chmod +x), после чего перезапустить udev (/etc/init.d/udev restart), чтобы новый конфиг был считан.

5. Сделать первое сканирование от root:
$ sudo ./adb devices

Телефон должен быть обнаружен. После этого сканирование и все операции можно производить от обычного пользователя.

З.Ы. Если вдруг после манипуляций с телефоном (особенно с галочкой Приложения -> Разработка -> Отладка USB) adb перестает видеть устройство - необходимо перезапустить adb-server, выполнив следующие команды от root:

# ./adb kill-server
# ./adb devices

Как видим подключение телефона к машине с Linux даже проще, чем к Windows: как минимум не нужно устанавливать никакие драйвера и сторонние приложения.

Понравилось сообщение - подпишитесь на блог или читайте меня в twitter

вторник, 5 января 2010 г.

Первые впечатления от Android и Samsung i5700 (Spica)


Прошли праздники (хотя, у кого - как, а у нас еще 5 дней каникул) и Суровый челябинский программист стал счастливым обладателем телефона Samsung i5700 на базе замечательной операционной системы Android 1.5, о чем собственно и хочется поговорить.

Сначала, почему Android? Прежде всего потому что это - открытая и динамично развивающаяся платформа. Причем развивается как сама платформа (к весне Samsung обещает обновления для i5700 на Android 2.0), так и появляются новые приложения под нее. Во-вторых, основным системным языком является Java, которым я довольно уверенно владею и который мне нравится, особенно по сравнению со всякими плюсами, а особенно - с урезаными версиями этих плюсов, использующимися в Symbian. В-третьих, наличие единого репозитория для приложений - Android Market, доступ к которому для России уже открыт (правда пока только к бесплатным программам, которых, впрочем, очень много).



Теперь пару слов об аппарате. Вообще, долгие годы я не доверял телефонам от Samsung, несмотря на то, что бытовая техника и ноутбуки у них получаются очень даже ничего. Но основные проблемы у таких телефонов заключались больше в используемом ПО, нежели в железе. В данном же случае мы имеем ПО на базе сторонней операционной системы - Android, поэтому выбор Samsung'а считаю оправданым, тем более что аппарт довольно дешев и при этом обладает большими возможностями.