воскресенье, 21 сентября 2008 г.

Воткнул блог в VerveEath

Узнал об интересном сервисе... Можно на google-maps воткнуть свой блог, привязать к конкретному географическому месту, а также просматривать какие блоги на карте уже имеются. Если ткнуть на следующую ссылку, то Вы сразу перенесётесь к моему блогу на карте:
Мой блог на VerveEarth

Фотки с Горного Алтая.

Выложил фотки с летнего похода на Алтай. Ходили небольшой группой на Шавлинские озёра на две недели. Представляю два альбома: первый - только природа, второй - природа и я :-)
Алтай июль-август 2008 (природа)
Алтай июль-август 2008 (природа и Я)

пятница, 18 июля 2008 г.

Как интернационализировать enum

Рассмотрим интернационализацию enum-ов на примере emun-а Gender (пол). В ресурсном файле определим перевод следующим образом:

gender.MALE=Мужчина
gender.FEMALE=Женщина

Определим непосредсвенно enum:

package ru.mugitus.myproject.model;

public enum Gender {

    MALE,

    FEMALE;

}

Создадим класс EnumFactory, который послужит фабрикой для создания объектов enum, зарегистрированных в контексте Seam:

package ru.mugitus.factory;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Scope;

@Scope(ScopeType.APPLICATION)
public class EnumFactory60;E extends Enum60;E62;62; {

    private Class60;E62; enumClass;

    public E[] getValues() {
        return enumClass.getEnumConstants();
    }

    public Class60;E62; getEnumClass() {
        return enumClass;
    }

    public void setEnumClass(Class60;E62; enumClass) {
        this.enumClass = enumClass;
    }

    public E valueOf(String literal) {
        return Enum.valueOf(enumClass, literal);
    }

    public String getValue(String literal) {
        return Messages.instance().get(this.getClass().getAnnotation(Name.class).value().split("\\.")[1] + "." + literal);
    }

}
Как видно, наш класс находится в пакете ru.mugitus.factory. Разместим в этом же пакете файл с названием package-info.java со следующим содержимым:

@Namespace(value="http://mugitus.ru/factory", prefix="ru.mugitus.factory")
package ru.mugitus.factory;

import org.jboss.seam.annotations.Namespace;

Это позволит нам определять компоненты на основе enum в файле components.xml. Только для этого нам надо принять за правило называть все компоненты(enum) с префиксом enum:

<components xmlns="http://jboss.com/products/seam/components" xmlns:mug="http://mugitus.ru/factory">

    ...

    <mug:enum-factory name="enum.gender" enum-class="ru.mugitus.myproject.model.Gender"/>

    ...

</components>

Теперь используем наш enum на xhtml-странице, например в выпадающем списке:

    <h:selectOneMenu value="#{myBean.gender}">
        <s:selectItems var="gender" value="#{enum.gender.values}" label="#{enum.gender.value(gender.name())}"/>
        <s:convertEnum/>
    </h:selectOneMenu>

вторник, 15 июля 2008 г.

Эх Java, посмотри-ка на Python !

Попалась на глаза интересная статья в блоге компании SmartWeb (UAProm.net, RUProm.net):

После прочтения некоторое время приходил в себя, задело за живое... Как же я его понимаю! Такое впечатление, что я шёл по тому же самому пути в освоении технологий Java и J2EE и прихожу к тем же самым выводам. Очень рекомендую прочитать этот топик всем!

Несколько дней голова была горячая и хотелось всё кардинально изменить и выбросить Java куда подальше. Но... Начитавшись нового материала по JBoss Seam, пошарив по Seam-овскому форуму, желание всё закидывать постепенно угасло. Я опять осознал, что мне очень нравится этот фреймворк :-)
И всё-таки остаются муки выбора клиентской части для следующих проектов. О чём я жалею, так это о том, что когда-то принялся изучать JSF. Только недавно я пришёл к выводу, что JSF не стоит того времени, которое нужно потратить на его качественное понимание. Конечно теперь не хочется выкидывать свои знания на помойку, поэтому приходится грызть JSF дальше. Прикидывю всё за и против JSF, прихожу к выводу, что плюсов тоже не так уж мало. Сейчас смотрю, что ребята задумали сделать в JSF 2.0.

Пример определения компонента в components.xml

Определим класс с подстановочным типом и с одним свойством этого типа (value):

package ru.mugitus.factory;

import java.io.Serializable;

public class SimpleBean implements Serializable {

    private T value;

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

}

Теперь в components.xml создадим компонент на основе этого класса:

<component name="mySimpleBean" class="ru.mugitus.factory.SimpleBean" auto-create="true"/>

Используем этот бин на xhtml-странице для инжектирования в него значения введённого пользователем в выпадающем списке:

<h:selectOneRadio value="#{mySimpleBean.value}">
    <f:selectItem itemValue="first" itemLabel="First"/>
    <f:selectItem itemValue="second" itemLabel="Second"/>
    <f:selectItem itemValue="third" itemLabel="Third"/>
</h:selectOneMenu>

И наконец, в pages.xml определим правила перехода:
<page view-id="/mypage.xhtml">
    <navigation evaluate="#{mySimpleBean.value}">
        <rule if-outcome="first">
            <redirect view-id="/firstPage.xhtml"/>
        </rule>
        <rule if-outcome="second">
            <redirect view-id="/secondPage.xhtml"/>
        </rule>
        <rule if-outcome="third">
            <redirect view-id="/thirdPage.xhtml"/>
        </rule>
    </navigation>
</page>

воскресенье, 13 июля 2008 г.

MagicDraw 15.5

Вышла новая версия MagicDraw — 15.5. Очень хорошая программа для тех, кто в свой практике использует UML. Написана на Java, соответственно работает как на Linux, так и на винде (у меня на Gentoo Linux). Делает компания NoMagic. В области UML там работают достаточно профессиональные ребята, оперативно следят за всеми изменениями в спецификации UML и реализовывают новые возможности в своей программе. Лично мне нравится гораздо больше других UML-инструментов, поэтому я её и использую. Сайт откуда можно скачать и узнать про эту программу — http://magicdraw.com.

воскресенье, 6 июля 2008 г.

Lazy and Expression Language


У нас есть множество 'Кошки' с подмножествами конкретных кошачьих пород: 'Персидские', 'Сиамские' и 'Агнора'. Предполагается, что все экземпляры кошек домашние и живут в хороших условиях, т.е. мало того, что они всегда сыты, у них есть собственная кроватка-домик.
Так как спальное место кошки — её персональная вещь, то ассоциация между кошкой и кроваткой будет двунаправленной, один-к-одному. CatBed — обобщающий класс, от которого наследуются конкретные подклассы, определяющие форму кроватки:
  • Cave — в виде пещеры (домик с крышей);
  • Den — логово, гнёздышко;
  • Cushion — в виде подушки;
  • Luxury — роскошная кровать;
  • WindowPerch — подстилка, цепляющаяся к подоконнику.

Предположим, что у Cat ссылка на CatBed является Lazy, т.е. с ленивой загрузкой, и отдаётся только по требованию.
Создадим кота персидской породы и назовём его 'Персик':

Cat cat = new Persian();
myCat.setName("Персик");


Сделаем ему кроватку:

CatBed bed = new Den();


И подарим ему эту кроватку:

cat.setCatBed(bed);

Так вот, если мы захотим прямо на xhtml странице, узнать диаметр кровати, напрямую от нашего 'Персика', используя EL-выражение, то ничего у нас не получится !

#{cat.catBed.diameter}

А не получится по той причине, что ассоциация между Cat и CatBed является Lazy. Hibernate для CatBed создаст proxy-объект, обёрнутый с помощью JavaAssist и у такого объекта мы не сможем иметь доступ к дополнительным полям классов-наследников на стороне EL-выражения. Если мы обратимся к полю color, то оно будет доступно без проблем, поскольку определено в обобщающем классе, а вот diameter определено в классе-наследнике, поэтому от Hibernate мы получим Exception, в котором утверждается, что объект ассоциации catBed не имеет поля diameter. Конечно проблема снимется, если ассоциацию сделать не Lazy, а Eager (fetch = FetchType.EAGER).