Статьи

Как создать индивидуальный код Java 8 с помощью плагинов

Одна вещь, которую ненавидят большинство программистов – это писать шаблонный код. Бесконечные часы тратятся на настройку классов сущностей и настройку соединений с базой данных. Чтобы избежать этого, вы можете позволить такой программе, как Speedment Open Source, сгенерировать весь этот код для вас. Это облегчает запуск и запуск проекта базы данных с минимальным ручным трудом, но как сохранить контроль над написанным кодом, когда его большие части передаются на компьютер?

Предположим, у вас есть база данных с таблицей «пользователь», в которой есть столбец «пол», и вы хотите, чтобы она была реализована как перечисление в Java. Если вы запустите Speedment и будете использовать его для генерации кода, поле «пол» будет представлено в виде строки. Причина этого в том, что нет никаких встроенных картографов для преобразования между базами данных ENUM и пользовательскими классами Java. Это один из тех случаев, когда вы можете почувствовать, что генератор лишает вас контроля. Что ж, не бойтесь, ведь начиная с версии 2.3 Hamilton вы можете получить тот же контроль, создав собственный плагин для Speedment!

Цель этой статьи

В этом примере у нас есть схема базы данных с таблицей «Person». У человека есть идентификатор, имя и пол. Пол объявлен как ENUM с тремя возможными значениями: «Мужской», «Женский» и «Другой». Если мы используем настройки по умолчанию в Speedment для создания этого класса, Speedment будет считать ENUM строкой. Однако есть некоторые проблемы с этим. Например, если вы хотите сохранить нового человека в базе данных, ничто не мешает вам неправильно указать пол и получить исключение при вставке. Вместо этого мы хотим определить перечисление java с указанными альтернативами в качестве констант. Что сделает сгенерированный код более безопасным и простым в использовании.

Мы можем добиться этого, используя плагин для Speedment!

Создание проекта плагина

Для любых пользовательских модификаций платформы Speedment нам потребуется определить плагин. Плагин – это часть программного обеспечения, которую можно подключить к среде исполнения Speedment из файла pom.xml. Плагин находится в своем собственном Maven-проекте и может быть разделен между проектами.

Начните с создания нового проекта Maven и объявите Speedment как зависимость. Вам не понадобится плагин speedment-maven в этом проекте.

1
2
3
4
5
<dependency>
    <groupId>com.speedment</groupId>
    <artifactId>speedment</artifactId>
    <version>${speedment.version}</version>
</dependency>

Система плагинов вращается вокруг двух интерфейсов; Компонент и КомпонентКонструктор. Компонент – это подключаемое программное обеспечение, которое может быть выполнено как часть жизненного цикла Speedment. Каждый компонент имеет ряд этапов, на которых ему разрешено выполнять. Это «инициализация», «загрузка», «разрешение» и «запуск».

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

Вот как будут выглядеть наши две реализации:

CustomMappingComponent.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public final class CustomMappingComponent
extends AbstractComponent {
     
    CustomMappingComponent(Speedment speedment) {
        super(speedment);
    }
 
    @Override
    public void onResolve() {
        // Resolve logic here...
    }
 
    @Override
    public Class<CustomMappingComponent> getComponentClass() {
        return CustomMappingComponent.class;
    }
 
    @Override
    public Software asSoftware() {
        return AbstractSoftware.with(
            "Custom Mapping Component",
            "1.0",
            APACHE_2
        );
    }
 
    @Override
    public Component defaultCopy(Speedment speedment) {
        return new CustomMappingComponent(speedment);
    }
}

CustomMappingComponentInstaller.java

1
2
3
4
5
6
7
8
public final class CustomMappingComponentInstaller
implements ComponentConstructor<CustomMappingComponent> {
 
    @Override
    public Component create(Speedment speedment) {
        return new CustomMappingComponent(speedment);
    }
}

Теперь у нас есть простой плагин, который можно добавить в проект Speedment. Следующим шагом является определение логики, которая отображается между строками и полами. Для этого, во-первых, нам нужно перечисление полов.

Gender.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public enum Gender {
    MALE   ("Male"),
    FEMALE ("Female"),
    OTHER  ("Other");
 
    private final String databaseName;
 
    Gender(String databaseName) {
        this.databaseName = databaseName;
    }
 
    public String getDatabaseName() {
        return databaseName;
    }
}

Если вы храните значения enum в верхнем регистре в базе данных, этот класс может быть намного короче, поскольку вы можете просто использовать метод Enum.name () для получения имени базы данных, но этот подход лучше, если вы хотите гибко именовать константы.

Теперь для финальной части. Нам нужно объявить тип, который реализует интерфейс TypeMapper в Speedment. Отображение типов действительно просто. Он содержит два метода для сопоставления с типом базы данных и из него, а также методы для извлечения класса Java обоих типов.

StringToGenderMapper.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public final class StringToGenderMapper implements TypeMapper<String, Gender> {
     
    @Override
    public Class<Gender> getJavaType() {
        return Gender.class;
    }
 
    @Override
    public Class<String> getDatabaseType() {
        return String.class;
    }
 
    @Override
    public Gender toJavaType(String value) {
        if (value == null) {
            return null;
        } else {
            return Stream.of(Gender.values())
                .filter(g -> g.getDatabaseName().equals(value))
                .findAny()
                .orElseThrow(() ->
                    new UnsupportedOperationException(
                        "Unknown gender '" + value + "'."
                    )
                );
        }
    }
 
    @Override
    public String toDatabaseType(Gender value) {
        if (value == null) return null;
        else return value.getDatabaseName();
    }
 
    @Override
    public boolean isIdentityMapper() {
        return false;
    }
}

Этот новый картограф также должен быть установлен на платформе Speedment. Мы можем сделать это из компонента, который мы создали ранее, изменив метод onResolve ():

CustomMappingComponent.java

1
2
3
4
5
6
@Override
public void onResolve() {
    // Resolve logic here...
    getSpeedment().getTypeMapperComponent()
        .install(StringToGenderMapper::new);
}

Наш новый плагин уже готов! Постройте проект, и вы готовы к работе!

Использование плагина

Чтобы использовать плагин в проекте, вам нужно всего лишь изменить pom.xml-файл этого проекта. Откройте существующий проект Speedment и найдите файл pom.xml. В нем вы сможете найти плагин speedment-maven-plugin. Чтобы сделать свой собственный плагин доступным для плагина maven, вам нужно добавить его как зависимость внутри тега <plugin> и добавить ComponentInstaller в конфигурацию. Вот пример того, как это может выглядеть:

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<plugin>
    <groupId>com.speedment</groupId>
    <artifactId>speedment-maven-plugin</artifactId>
    <version>${speedment.version}</version>
 
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
 
        <!-- Our plugin project -->
        <dependency>
            <groupId>com.github.pyknic</groupId>
            <artifactId>custom-mapping-component</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
  
    <configuration>
        <components>
            <!-- Path to the component installer -->
            <component implementation="
com.github.pyknic.salesinfo.plugin.CustomMappingComponentInstaller
            " />
        </components>
    </configuration>
</plugin>

Вам также необходимо добавить проект как зависимость времени выполнения, поскольку новый Gender-enum должен быть доступен из сгенерированного кода.

1
2
3
4
5
6
7
8
9
<dependencies>
    ...
    <dependency>
        <groupId>com.github.pyknic</groupId>
        <artifactId>custom-mapping-component</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    ...
</dependencies>

Пробовать

Это оно! Плагин установлен! Если вы хотите, чтобы конкретный столбец отображался на пол, а не на строку, вы можете перейти в пользовательский интерфейс, перейти к определенному столбцу в «дереве проекта» и выбрать новый сопоставитель типов в раскрывающемся списке.

Select_TypeMapper

Если вы хотите увидеть список всех компонентов и / или сопоставителей типов, загруженных в платформу, вы также можете перейти к «О программе» → «Компоненты…» в пользовательском интерфейсе. Там вы должны увидеть новый компонент.

Компоненты-плагин

Резюме

В этой статье вы узнали, как создать собственный плагин для Speedment, который интегрирует новый Type Mapper от String до перечисления Gender. Вы также узнали, как увидеть, какие компоненты загружены в платформу, и выбрать, какой тип сопоставления вы хотите использовать для каждого столбца.

PS: Если вы создаете несколько интересных новых картографов для своего проекта Speedment, рассмотрите возможность поделиться ими с сообществом в нашем чате Gitter !

Ссылка: Как создать собственный код Java 8 с помощью плагинов от нашего партнера JCG Эмиля Форслунда из блога Age of Java .