Eugene Burtsev's blog

Объединение истории репозиториев Mercurial

Жил-был один проект. Жил он тихо мирно в своем репозитории и постепенно обзаводился друзьями-проектами, жившими в своих репозиториях. И вот захотели они сьехать на одну квартиру, дабы экономить на квартплате и чаще видеться друг с другом, и позвали девелопера что бы он им помог.

Вот такая вот сказочка. Собственно задача такова: создать родительский проект maven содержащий историю всех подпроектов, находившихся ранее в отдельных репозиториях. В принципе это очень просто делается по этой инструкции. Но если следовать данной инструкции у репозитория получится несколько хвостов (как на рисунке ниже).

1
2
3
4
5
6
7
8
9
10
   @
   |
   o-----------o
   |           |
   .           .
   .           .
   |           |
   o           o
  tail        tail
   #1          #2

Мне бы хотелось видеть историю в виде примерно такого графа:

1
2
3
4
5
6
7
8
9
10
11
12
   @
   |
   o-----------o
   |           |
   . default   .
   .           . Feature
   |           | branch
   o           o
   |           |
   o-----------o
   |
   o

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

Maven Custom Repository Layout

Приветствую всех.

Хочу поделиться с сообществом небольшим велосипедом - расширением для мавена позволяющим получать доступ к репозиториям с кастомной структурой.

Для начала расскажу как я до такого докатился. В процессе работы над проектом пришла мысль о том зависимости JavaScript типа JQuery ничем не управляются, и при обновлении приходится качать библиотеки вручную, что совершенно не впечатляет. И вот так появилось дикое желание найти какой-нибудь менеджер зависимостей но для javascript. В первую очередь в своих поисках я наткнулся на Bower но необходимость введения дополнительного шага в процессе сборки отпугивало как node.js в зависимостях. Тут я вспомнил про CDN с коих можно невозбранно тянуть js-библиотеки (например jquery на Google CDN: http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js). Поскольку в проекте используется maven для сборки то логичной мыслью было натравить его на эти залежи библиотек… Но все оказалось не так просто. Дело в том что структура файловой системы CDN отличается от стандартной для для maven. После 2 часов поиска решения на просторах интернетов найдено не было,и решил я написать свой велосипед. Если я еще не утомил вас то прошу под кат.

Пример совместной работы JSF2 и Spring Framework

Совсем недавно открыл для себя Spring Framework и понял, что до этого момента упускал множество возможностей. По это причине решил переписать парочку приложений с использованием Spring. Ниже я расскажу как интегрировать Spring и JSF2

Google Gdata Maven Repository

Недавно пришлось столкнуться с тем что для гугловской библиотеки gdata отсутствуют maven-репозитории. Конечно есть новая библиотека google-api-java-client, но в ней реализованы не все API, например недостает Provisioning API для доменов.

В поиске было найдено несколько репозиториев, но во всех из них лежат только старые версии библиотеки.

Так же был найден замечательный скрипт для создания локального maven-репозитория.

Поскольку не у всех есть время и возможность создать свой репозиторий (под Windows например у меня этот скрипт запустить так и не получилось), то я решил выложить результаты работы у себя на сервере - вдруг кому-то и сгодится.

Подробности под катом

Поддержка Java 7 Try-with-resources в MyBatis

В Java 7 появился аналог конструкции using из C# - try-with-resources. Данную фишку очень хорошо использовать для автоматического закрытия ресурсов типа коннектов к базам данных и тд. Например так:

1
2
3
4
try (SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession()) {
  // Work with session
  session.commit();
}

Но вот беда - класс org.apache.ibatis.session.SqlSession из MyBatis 3.0.6 использующегося в проекте не реализует интерфейс AutoCloseable необходимый для того что бы эта конструкция заработала. Надеюсь что в следующей версии поддержку добавят, а пока предлагаю небольшой workaround.

Обход исключения org.apache.ibatis.transaction. TransactionException в iBATIS при временной недоступности сервера баз данных

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error opening session.  Cause: org.apache.ibatis.transaction.TransactionException: Error configuring AutoCommit.  Your driver may not support getAutoCommit() or setAutoCommit(). Requested setting: false.  Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 59,121,876 milliseconds ago.  The last packet sent successfully to the server was 59,121,984 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
### Cause: org.apache.ibatis.transaction.TransactionException: Error configuring AutoCommit.  Your driver may not support getAutoCommit() or setAutoCommit(). Requested setting: false.  Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 59,121,876 milliseconds ago.  The last packet sent successfully to the server was 59,121,984 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
        at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:83)
        at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession(DefaultSqlSessionFactory.java:32)
        at com.greytower.htmltemplates.core.dao.ibatis.TemplatesDAOImpl.readAll(TemplatesDAOImpl.java:70)
        at com.greytower.htmltemplates.beans.TemplatesEditorBean.init(TemplatesEditorBean.java:86)
        ... 59 more
Caused by: org.apache.ibatis.transaction.TransactionException: Error configuring AutoCommit.  Your driver may not support getAutoCommit() or setAutoCommit(). Requested setting: false.  Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 59,121,876 milliseconds ago.  The last packet sent successfully to the server was 59,121,984 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
        at org.apache.ibatis.transaction.jdbc.JdbcTransaction.setDesiredAutoCommit(JdbcTransaction.java:51)
        at org.apache.ibatis.transaction.jdbc.JdbcTransaction.<init>(JdbcTransaction.java:19)
        at org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory.newTransaction(JdbcTransactionFactory.java:15)
        at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:78)
        ... 62 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 59,121,876 milliseconds ago.  The last packet sent successfully to the server was 59,121,984 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

PrimeFaces Tips & Tricks

В данном посте я постараюсь описать решения типичных проблем возникающих при работе с прекрасной библиотекой JSF компонентов PrimeFaces

Установка связки Mercurial + UWSGI + Nginx + HTTPS на Ubuntu Server 10.04

Недавно появилась необходимость установить Mercurial сервер, используя в качестве фронтэнда nginx. В интернете довольно много информации на данную тему, но пришлось довольно много импровизировать что бы добиться результата. Итак, ниже представлен результат труда по настройке этой связки.