пятница, 15 апреля 2011 г.

Паттерн Entity-Attribute-Value (EAV)

Паттерн "Entity-Attribute-Value" может пригодиться при проектировании базы данных товаров. Рассмотрим пример на СУБД Oracle.

В простейшем случае структура базы данных будет выглядеть следующим образом:
-- Create table
create table entity
(
  entity_id number,
  name      varchar2(50)
);
-- Create/Recreate primary, unique and foreign key constraints 
alter table entity
  add constraint xpk_entity_id primary key (ENTITY_ID);
Таблица Entity хранит сами сущности - товары. В качестве полей указываем общие свойства сущностей, таких как Название товара
-- Create table
create table attribute
(
  attribute_id   number,
  attribute_name varchar2(50),
  attribute_type varchar2(10),
  decriptions    clob
);
-- Create/Recreate primary, unique and foreign key constraints 
alter table attribute
  add constraint xpk_attribute_id primary key (ATTRIBUTE_ID);
Таблица Attribute хранит различные свойства товаров - атрибуты. В качестве полей указываем название атрибута, тип.
-- Create table
create table value
(
  attribute_id   number,
  entity_id      number,
  string_value   varchar2(100),
  number_value   number
);
таблица value - для хранения значений атрибутов, а также для связи многие ко многим между товарами и их атрибутами.

Реализация разных типов данных может быть реализована различными способами. Например вместо одного поля value можно создать разные поля под разные типы данных: string_value, number_value и использовать нужное исходя из типа атрибута из таблицы attribute.

Более подробная информация по паттерну

суббота, 9 апреля 2011 г.

Simple ORM

Наверное многие начинающие java программисты задумывались над тем, как неудобно писать слой взаимодейстия с базой данных на чистом JDBC. Ctrl+c, Ctrl+v и изменение названия таблиц и параметров. Все это приводит к излишнему дублированию кода. Конечно можно сразу взять тот же Hibernate или любую другую реализацию JPA. Но для небольших и простых проектов, имхо это как "из пушки по воробьям". К тому же считаю что надо один раз написать ORM самому, чтобы понять основы его работы.

В этой статье рассмотрим создание своего простого ORM на примере работы с СУБД Oracle.

Создадим интерфейс Persistence и реализующий его класс PersistenceOraImpl - собственно сам персистенс Api для работы с БД.

Список методов в Persistence:

1. selectAll - выбирает все записи из таблицы;
2. select - выбирает записи по заданным параметрам;
3. selectRow - выбирает одну запись по заданным параметрам;
4. insert - вставляет запись;
5. update - обновляет запись;
6. delete - удаляет запись.

Сам интерфейс выглядит так:
public interface Persistence {

 public List selectAll(Class<?> clazz);

 public List select(Class<?> clazz, Map<String, Object> params);

 public Object selectRow(Class<?> clazz, Map<String, Object> params);

 public void insert(Object obj);

 public void update(Object obj);

 public void delete(Class<?> clazz, Map<String, Object> params);

 public Connection getConnection();

 public void setConnection(Connection conn);
}

вторник, 5 апреля 2011 г.

Сериализация обьекта

отправка обьекта:
Message message = new Message();
 ByteArrayOutputStream fos = new ByteArrayOutputStream();
 ObjectOutputStream oos = new ObjectOutputStream(fos);
 oos.writeObject(message);
 oos.flush();
 oos.close();

 byte[] messageBodyBytes = fos.toByteArray();
где Message - POJO обьект.

Далее обьект можно записать в файл или отправить в сообщении.

прием обьекта:
ByteArrayInputStream fis = new ByteArrayInputStream(messageBodyBytes);
 ObjectInputStream oin = new ObjectInputStream(fis);
 Message mess = (Message) oin.readObject();

среда, 30 марта 2011 г.

Настраиваем поддержку русского языка в Linux Ubuntu

Открываем шелл: ALT+F2.

Обновляем репозиторий:
sudo apt-get update
Качаем саппорт языка, заодно всякие медиа и эмулятор windows:
sudo apt-get install language-support-ru ubuntu-restricted-extras wine

При установке шрифтов windows выскакивает лицензионное соглашение. Соглашаемся с ним TAB+ENTER.

После установки, для настройки переключения раскладки на клавиатуре редактируем файл:
sudo nano /etc/default/console-setup
Для переключения по CTRL+SHIFT зменяем строки:
XKBLAYOUT="us,ru"
XKBVARIANT=",winkeys"
XKBOPTIONS="grp:ctrl_shift_toggle"
Для переключения по ALT+SHIFT, устанавливаем параметр
XKBOPTIONS="grp:alt_shift_toggle"
перезагружаемся.

пятница, 18 марта 2011 г.

Огромные шрифты в темах PrimeFaces 2.2.x

Чтобы избавиться от огромных шрифтов в PrimeFaces 2.2 надо переопределить стиль ui-widget.

Для этого создаем css следующего вида:
.ui-widget {
   font-size: 12px !important;
}

и подтягиваем ее на странице:

   <link rel="stylesheet" type="text/css" href="mystyle.css"/>

четверг, 10 февраля 2011 г.

Реализуем обмен сообщениями AMQP с помощью RabbitMQ

Для начала установим и настроим RabbitMQ.

Тут все просто, скачиваем с основного сайта Erlang, проставляем ERLANG_HOME. Далее качаем и ставим сам RabbitMQ. Запускаем Rabbit через командную строку:  
%RABBITMQ_SERVER%/sbin/rabbitmq-server.bat
Если появилось сообщение broking running то все ок, наш сервер работает.

Теперь надо настроить пользователя и виртуальный хост сервера. Запускаем с командной строки:
%RABBITMQ_SERVER%/sbin/rabbitmqctl.bat add_user admin admin
Пользователь admin с паролем admin создан. Теперь создадим виртуальный хост:
rabbitmqctl.bat add_vhost ru.vie2004.vhost
после чего надо дать права на пользование им нашим пользователем:
rabbitmqctl.bat set_permissions -p ru.vie2004.vhost admin .* .* .*

Все, сервер настроен на работу. Более тонкие настройки можно найти на RabbitMQ


Теперь напишем простенькие Sender и Consumer.


Sender:
ConnectionFactory factory = new ConnectionFactory();

factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("ru.vie2004.vhost");
factory.setHost("localhost");
factory.setPort(5672);

Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
String exchangeName = "myNewExchange";
String routingKey = "myNewRoute";

byte[] messageBodyBytes = "Наше сообщение".getBytes();

channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);
Если надо передать не текст, а обьект, то необходимо сериализовать его в byte[].

Consumer:
ConnectionFactory factory = new ConnectionFactory(); 

factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("ru.vie2004.vhost");
factory.setHost("localhost");
factory.setPort(5672);
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
boolean durable = true;

channel.exchangeDeclare("myNewExchange", "direct", durable);
channel.queueDeclare("myNewQueue", durable, false, false, null);
channel.queueBind("myNewQueue", "myNewExchange", "myNewRoute");

boolean noAck = false;
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, noAck, consumer);

while (true) {
  QueueingConsumer.Delivery delivery;
  try {
    delivery = consumer.nextDelivery();
  } catch (InterruptedException ie) {
    continue;
  }
  System.out.println("Получено сообщение: " + new String(delivery.getBody()));
}
Все, запускаем слушателя с отправителем и читаем сообщение.


ps. Не могу не упомянуть что для RabbitMQ есть аппендер log4j. Работать с ним можно, но придется немного подработать напильником для удобного пользования.

среда, 9 февраля 2011 г.

primefaces migrate from 2.2.RC2 to 2.2

С выходом на днях новой версии primefaces 2.2 появилось два нововведения. К сожалению не все они мне понравились:

1. теперь user guide платная, стоит порядка 10 евро.
http://primefaces.org/documentation.html
2. темы теперь надо подключать через jar.
http://primefaces.org/themes.html

ps. Документация от 26.07.2010. Настройки тем действительны только до версии 2.2.RC2 включительно.