Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
lleming, это мысль. Дайте больше ключевых слов. Как называется этот плагин которые сделат мне модельки.

И потом по ссылке выше http://www.fictionbook.org/index.php/Документы представлен аж целый список форматов.

Тоесть я буду озабочен новой задачей. Детектировать собственно версию документа. Это как?
Применять к документу все модели последовательно? Пока не возникнет Exception?
1 май 19, 13:44    [21876312]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Чорт бы подрал этот Стакс. Говно-говняцкое вышло.

Я уже думаю что идея использовать Dom не так плоха. По крайней мере рутину пока отодвину.
Останется перформанс но это можно потом довести.

+
    @Override
    public Fb2Document apply(InputStream inputStream) {
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        XMLEventReader xmlEventReader = null;
        Fb2Document document = new Fb2Document();
        try {
            xmlEventReader = xmlInputFactory.createXMLEventReader(inputStream);
            while (xmlEventReader.hasNext()) {
                XMLEvent event = xmlEventReader.nextEvent();
                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                    String localPart = startElement.getName().getLocalPart();

                    if (localPart.equals("description")) {
                        ......
                    }

                    if (localPart.equals("first-name")) {
                        logger.info("::[1] first-name");
                        while(!event.isCharacters()){
                            event = xmlEventReader.nextEvent();
                        }
                        logger.info("event.asCharacters().getData() = '{}'", event.asCharacters().getData());
                        document.setAuthor(event.asCharacters().getData());
                    }
1 май 19, 18:25    [21876477]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
alex55555
Member

Откуда:
Сообщений: 2099
mayton
Я уже думаю что идея использовать Dom не так плоха.

Особенно если проект для поигрушек.

JAXB содержит в себе инструменты для генерации классов по XSD. Другие либы тоже иногда так могут. И для пет-прожектов на производительность обычно плевать, поэтому генерим классы и по быстрому получаем результат.
2 май 19, 12:26    [21876825]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
alex55555
Member

Откуда:
Сообщений: 2099
mayton
Детектировать собственно версию документа. Это как?

Это значит прочитать в файле некий ключ. Обычное чтение из потока с этим легко справится. Быстро и несложно.
2 май 19, 12:27    [21876827]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
alex55555
mayton
Я уже думаю что идея использовать Dom не так плоха.

Особенно если проект для поигрушек.

JAXB содержит в себе инструменты для генерации классов по XSD. Другие либы тоже иногда так могут. И для пет-прожектов на производительность обычно плевать, поэтому генерим классы и по быстрому получаем результат.

Это мысль. Я попробую с помощью тулза xjc нагенерить API.
2 май 19, 19:45    [21877074]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Хм... я чудесным образом ее снес или сломал.
# xjc

Command 'xjc' not found, but can be installed with:

apt install openjdk-11-jdk-headless
apt install openjdk-8-jdk-headless 

# apt install openjdk-11-jdk-headless 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
openjdk-11-jdk-headless is already the newest version (11.0.2+9-3ubuntu1~18.04.3).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
2 май 19, 23:01    [21877130]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
И чего это они через пень-колоду... Через 2 уровня симлинков протащили. Странный вариант поставлять
продукт. Ну ладно. Вобщем JDK какая-то урезанная. Что-то есть. Чего-то нет.

root@mayton-HP-250-G4-Notebook-PC:~# 
root@mayton-HP-250-G4-Notebook-PC:~# whereis xjc
xjc: /usr/bin/xjc /usr/share/man/man1/xjc.1.gz
root@mayton-HP-250-G4-Notebook-PC:~# ls -l /usr/bin/xjc 
lrwxrwxrwx 1 root root 21 May 26  2018 /usr/bin/xjc -> /etc/alternatives/xjc
root@mayton-HP-250-G4-Notebook-PC:~# ls -l /etc/alternatives/xjc
lrwxrwxrwx 1 root root 42 Jun 25  2018 /etc/alternatives/xjc -> /usr/lib/jvm/java-11-openjdk-amd64/bin/xjc
root@mayton-HP-250-G4-Notebook-PC:~# ls -l /usr/lib/jvm/java-11-openjdk-amd64/bin/xjc
ls: cannot access '/usr/lib/jvm/java-11-openjdk-amd64/bin/xjc': No such file or directory
root@mayton-HP-250-G4-Notebook-PC:~# 
root@mayton-HP-250-G4-Notebook-PC:~# ls -1 /usr/lib/jvm/java-11-openjdk-amd64/bin
jaotc
jar
jarsigner
java
javac
javadoc
javap
jcmd
jconsole
jdb
jdeprscan
jdeps
jhsdb
jimage
jinfo
jjs
jlink
jmap
jmod
jps
jrunscript
jshell
jstack
jstat
jstatd
keytool
pack200
rmic
rmid
rmiregistry
serialver
unpack200
2 май 19, 23:17    [21877136]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Двенадцатка такая-же коцаная.

Вобщем приблизительное решение моей беды описано здесь https://www.jesperdj.com/2018/09/30/jaxb-on-java-9-10-11-and-beyond/

Всё пошел спать. Всем спасибо.
3 май 19, 00:35    [21877149]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
lleming
Member

Откуда:
Сообщений: 1567
могу ошибаться но вроде начиная с 9 версии всякую аля jee хрень выпилили из jdk
3 май 19, 10:41    [21877245]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
По самой первой ссылке в начале топика можно качнуть 4 файла.

05/02/2019  07:54 PM            34,541 FictionBook.xsd
05/02/2019  07:54 PM             8,169 FictionBookGenres.xsd
05/02/2019  07:54 PM               480 FictionBookLang.xsd
05/02/2019  07:54 PM               642 FictionBookLinks.xsd


Щас я временно на другой конфигурации. Win10+JDK8.

Пока - неудача. Три файла сгенерировали варнинг локации. И один - что-то непонятно. Надо разбираться.

Скрипт
+
@echo on

prompt $p$g

java -version

xjc -p mayton -verbose -d . FictionBook.xsd

echo "%ERRORLEVEL%"

xjc -p mayton -verbose -d . FictionBookGenres.xsd

echo "%ERRORLEVEL%"

xjc -p mayton -verbose -d . FictionBookLang.xsd

echo "%ERRORLEVEL%"

xjc -p mayton -verbose -d . FictionBookLinks.xsd

echo "%ERRORLEVEL%"


Лог.

+
prompt $p$g 

java -version 

xjc -p mayton -verbose -d . FictionBook.xsd 
parsing a schema...
[ERROR] cos-element-consistent: Error for type '#AnonType_FictionBook'. Multiple elements with name 'body', with different types, appear in the model group.
  line 75 of file:/C:/Users/mayton/git/XSD/FictionBook.xsd

Failed to parse a schema.

echo "-1" 
"-1"

xjc -p mayton -verbose -d . FictionBookGenres.xsd 
parsing a schema...
compiling a schema...
[INFO] generating code
unknown location

mayton\GenreType.java
mayton\ObjectFactory.java

echo "0" 
"0"

xjc -p mayton -verbose -d . FictionBookLang.xsd 
parsing a schema...
compiling a schema...
[INFO] generating code
unknown location


echo "0" 
"0"

xjc -p mayton -verbose -d . FictionBookLinks.xsd 
parsing a schema...
compiling a schema...
[INFO] generating code
unknown location


echo "0" 
"0"


Успешно отработал только справочник жанров (FictionBookGenres). Был сгенерировано 2 сущности.
Все остально проигнорировано.
3 май 19, 10:47    [21877247]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Да. Спул java -version попал в поток ошибок.

java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
3 май 19, 10:48    [21877248]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
alex55555
Member

Откуда:
Сообщений: 2099
mayton
Успешно отработал только справочник жанров (FictionBookGenres). Был сгенерировано 2 сущности.
Все остально проигнорировано.

Успешны все, кроме первой схемы. Видимо в последних двух какие-то специфические фичи объявлены, не мапятся на классы. А в первой схеме два разных элемента body - схема некошерная.
3 май 19, 11:57    [21877278]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
А в чем успех если ничего не сгенерировано? Утилита молча отработала. Выхода нет.
3 май 19, 12:18    [21877294]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Хм... по идее FictionBook это родительский документ. Все остальные в него включены. Наверное правильный путь - это
собрать его.

    <xs:import namespace="http://www.w3.org/1999/xlink"                       schemaLocation="FictionBookLinks.xsd"/>
    <xs:import namespace="http://www.gribuser.ru/xml/fictionbook/2.0/genres"  schemaLocation="FictionBookGenres.xsd"/>
    <xs:import namespace="http://www.w3.org/XML/1998/namespace"               schemaLocation="FictionBookLang.xsd"/>
3 май 19, 18:14    [21877442]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Выкинул 99% контента из главного документа. Оставил только теги stylesheet, binary. Работает. ДжаксБи сгенерил мне сущность
FictionBook и справочник GenreType.

    <xs:element name="FictionBook">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="stylesheet" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="type" type="xs:string" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
                <xs:element name="binary" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:base64Binary">
                                <xs:attribute name="content-type" type="xs:string" use="required"/>
                                <xs:attribute name="id" type="xs:ID" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>


Дальнейше направление мне ясно. Такими мелкики шажками можно добить этот Fb2 mapper. Вот только не хочется залипнуть
на неделю.

Кто знаток jaxb и кто возьмётся пофиксить эту рутину? Буду респектовать.
3 май 19, 18:30    [21877449]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
chpasha
Member

Откуда:
Сообщений: 7794
вроде пару мест всего нужно пофиксить, надеюсь идея понятна
<build>
        <plugins>                       
            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <args>
                        <arg>-npa</arg>
                    </args>
                    <schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory>
                    <schemaIncludes>
                        <include>FictionBook.xsd</include>
                    </schemaIncludes>
                    <bindingIncludes>
                        <include>bindings.xjb</include>
                    </bindingIncludes>
                    <generatePackage>com.test.fb2</generatePackage>
                    <removeOldOutput>true</removeOldOutput>
                </configuration>
            </plugin>
        </plugins>
    </build>


К сообщению приложен файл (fb4mayton.zip - 11Kb) cкачать
3 май 19, 18:55    [21877459]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
chpasha
Member

Откуда:
Сообщений: 7794
З.Ы. по приатаченным схемам классы генерятся, саму де-сериализацию уже не проверял
3 май 19, 18:57    [21877460]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
chpasha, спасибо большое. Вот этот биндинг файл мне был и нужен. А сборка проекта у меня на основе градла.

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          version="2.1">
    <bindings schemaLocation="FictionBook.xsd" version="1.0">
        <!-- Customise the package name -->
        <!--<schemaBindings>
            <package name="com.example.schema"/>
        </schemaBindings>-->

        <bindings node="//xs:complexType[@name='dateType']">
            <bindings node=".//xs:attribute[@name='value']">
                <property name="DateTypeValue"/>
            </bindings>
        </bindings>

        <bindings node="//xs:complexType[@name='linkType']">
            <bindings node=".//xs:attribute[@ref='xlink:type']">
                <property name="XlinkType"/>
            </bindings>
        </bindings>

    </bindings>
</bindings>


Поэтму я пока оставлю свой баш скриптик.

#!/usr/bin/env bash

xjc -p mayton.elastic.xsd -verbose -d ../../java -b binding.xjb FictionBook.xsd
3 май 19, 19:04    [21877467]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
alex55555
Member

Откуда:
Сообщений: 2099
mayton
А в чем успех если ничего не сгенерировано?

В отсутствии ошибок.

Надо смотреть, что там внутри и как оно вяжется с основной схемой. Далее надо понять, поддерживает ли генератор такой тип связей.

В общем надо подробно разбираться со схемой и JAXB, убить часик-другой.
4 май 19, 14:56    [21877733]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
kolchanov
Member

Откуда: Питер
Сообщений: 165
ИМХО гораздо проще работать с INPX файлом коллекции, а не парсить fb2 файлы, если конечно, работа с fb2 не является самоцелбю.
13 май 19, 20:31    [21883770]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
kolchanov
ИМХО гораздо проще работать с INPX файлом коллекции, а не парсить fb2 файлы, если конечно, работа с fb2 не является самоцелбю.

По INPX я ничего релевантного не нахожу. Можете прояснить этот термин?
13 май 19, 21:45    [21883817]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5627
mayton
kolchanov
ИМХО гораздо проще работать с INPX файлом коллекции, а не парсить fb2 файлы, если конечно, работа с fb2 не является самоцелбю.

По INPX я ничего релевантного не нахожу. Можете прояснить этот термин?

- погуглил за тебя: INPX
13 май 19, 22:01    [21883831]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
mayton
Member

Откуда: loopback
Сообщений: 40520
Kachalov
mayton
пропущено...

По INPX я ничего релевантного не нахожу. Можете прояснить этот термин?

- погуглил за тебя: INPX

Дружище. Я не понимаю как это мне поможет?
13 май 19, 22:38    [21883845]     Ответить | Цитировать Сообщить модератору
 Re: Быстрый маппинг FB2=>JavaObject  [new]
kolchanov
Member

Откуда: Питер
Сообщений: 165
mayton,
Ну как, это описание формата внутри zip файла, в котором находится структурированная информация по каждой книге.
Парсить эту структуру на несколько порядков проще и быстрее чем все fb2 файлы
Скачать актуальную версию для флибусты можно тут
https://booktracker.org/viewtopic.php?t=64690


Contains book description. One per line. Line delimiter - \r\n. Line fileds should be the same as in structure.info except delimiter is 0x04 instead of ;. Field can be empty, i.e. have zero length.

Fields description:

AUTHOR string

One or more authors in format Surname,Name,Middlename: without spaces.

GENRE string

One or more genres in format genre_id:. Can be found in Genres.cs.

TITLE string

Book title.

SERIES string

Book series.

SERNO integer

Book number in series.

FILE string

Filename without extension.

SIZE integer

File size in bytes.

LIBID integer

Book id in library. Likely to be unique across one .inpx file.

DEL integer?

Empty - book is present. 1 - book is deleted.

EXT string

File extension without front dot.

DATE string

Date of book publication or adding to library. Should be in format YYYY-MM-DD.

LANG string

Book's language. en, ru, etc...

KEYWORDS string

Format keyword:.

FOLDER string

Folder relative to library root. (this one isn't implemented yet in DotOPDS)

Example:

Shakespeare,William,:<0x04>tragedy:<0x04>Hamlet<0x04><0x04>0<0x04>shakespeare_haml
13 май 19, 22:49    [21883857]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Java Ответить