/
Libra
/
my-application
Обзор
Документация
Войти
/
Libra
/
my-application
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/main/java/com/libraprogramming/myapplication/service/XmlFileCardsExportService.java
140 строк
6 KB
Толмачёв Владимир Викторович
Architecture refactoring 2
20 июл 2026, 17:22
20 июл 2026, 17:22
87aa6f2
Код
Авторство
О чём код?
package com.libraprogramming.myapplication.service; import android.content.Context; import android.net.Uri; import android.provider.DocumentsContract; import android.util.Xml; import android.webkit.MimeTypeMap; import androidx.annotation.NonNull; import com.libraprogramming.domain.exception.CardsExportException; import com.libraprogramming.domain.model.Card; import com.libraprogramming.domain.model.ExtraProperty; import com.libraprogramming.domain.repository.CardRepository; import com.libraprogramming.domain.service.CardsExportService; import org.jetbrains.annotations.NotNull; import org.xmlpull.v1.XmlSerializer; import javax.inject.Inject; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Objects; public class XmlFileCardsExportService extends XmlCardsService implements CardsExportService { @NotNull private final Context context; @NonNull private final CardRepository repository; @Inject public XmlFileCardsExportService( @NotNull Context context, @NonNull CardRepository repository) { this.context = context; this.repository = repository; } @Override public void exportCards(Uri exportTargetUri) throws CardsExportException { List<Card> cards = repository.getAll(); final var treeDocumentId = DocumentsContract.getTreeDocumentId(exportTargetUri); final var targetUri = DocumentsContract.buildDocumentUriUsingTree(exportTargetUri, treeDocumentId); try { final var fileExtension = MimeTypeMap.getFileExtensionFromUrl(Constant.EXPORT_FILENAME); final var mimeType = Objects.requireNonNull(MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension)); var documentUri = DocumentsContract.createDocument(context.getContentResolver(), targetUri, mimeType, Constant.EXPORT_FILENAME); try (var stream = context.getContentResolver().openOutputStream(Objects.requireNonNull(documentUri)); var writer = new BufferedWriter(new OutputStreamWriter(stream, StandardCharsets.UTF_8))) { final var serializer = Xml.newSerializer(); serializer.setOutput(writer); serializer.startDocument(Xml.Encoding.UTF_8.name(), Boolean.TRUE); serializer.setFeature(FEATURE_IDENT, true); writeCards(serializer, cards); serializer.endDocument(); serializer.flush(); } } catch (IOException exception) { throw new CardsExportException("Error writing file", exception); } } private void writeElement( @NotNull XmlSerializer serializer, @NotNull String elementName, @NotNull final String text) throws IOException { serializer.startTag(Constant.ELEMENT_NAMESPACE, elementName); serializer.text(text); serializer.endTag(Constant.ELEMENT_NAMESPACE, elementName); } private void writeCodeElement(@NotNull XmlSerializer serializer, @NotNull Card card) throws IOException { serializer.startTag(Constant.ELEMENT_NAMESPACE, Constant.CODE_ELEMENT); serializer.attribute(Constant.ATTRIBUTE_NAMESPACE, Constant.TYPE_UID_ATTRIBUTE, card.getCodeFormat().uuid().toString()); serializer.text(card.getCode()); serializer.endTag(Constant.ELEMENT_NAMESPACE, Constant.CODE_ELEMENT); } private void writeExtraPropertyValueElement( @NotNull XmlSerializer serializer, @NotNull ExtraProperty extraProperty) throws IOException { serializer.startTag(Constant.ELEMENT_NAMESPACE, Constant.VALUE_ELEMENT); serializer.attribute(Constant.ATTRIBUTE_NAMESPACE, Constant.TYPE_UID_ATTRIBUTE, extraProperty.getType().uuid().toString()); serializer.text(extraProperty.getValue()); serializer.endTag(Constant.ELEMENT_NAMESPACE, Constant.VALUE_ELEMENT); } private void writeExtraPropertyElement( @NotNull XmlSerializer serializer, @NotNull ExtraProperty extraProperty) throws IOException { serializer.startTag(Constant.ELEMENT_NAMESPACE, Constant.PROPERTY_ELEMENT); serializer.attribute(Constant.ATTRIBUTE_NAMESPACE, Constant.UID_ATTRIBUTE, extraProperty.getUid().toString()); writeExtraPropertyValueElement(serializer, extraProperty); serializer.endTag(Constant.ELEMENT_NAMESPACE, Constant.PROPERTY_ELEMENT); } private void writeExtraPropertiesElement( @NotNull XmlSerializer serializer, @NotNull List<ExtraProperty> extraProperties) throws IOException { serializer.startTag(Constant.ELEMENT_NAMESPACE, Constant.EXTRA_PROPERTIES_ELEMENT); for (var extraProperty : extraProperties) { writeExtraPropertyElement(serializer, extraProperty); } serializer.endTag(Constant.ELEMENT_NAMESPACE, Constant.EXTRA_PROPERTIES_ELEMENT); } private void writeCard(@NotNull XmlSerializer serializer, @NotNull Card card) throws IOException { serializer.startTag(Constant.ELEMENT_NAMESPACE, Constant.CARD_ELEMENT); serializer.attribute(Constant.ATTRIBUTE_NAMESPACE, Constant.UID_ATTRIBUTE, card.getUid().toString()); writeElement(serializer, Constant.NAME_ELEMENT, card.getName()); writeCodeElement(serializer, card); writeExtraPropertiesElement(serializer, card.getExtraProperties()); serializer.endTag(Constant.ELEMENT_NAMESPACE, Constant.CARD_ELEMENT); } private void writeCards(@NotNull XmlSerializer serializer, @NotNull List<Card> cards) throws IOException { serializer.startTag(null, Constant.ROOT_ELEMENT); serializer.setPrefix("e", Constant.ELEMENT_NAMESPACE); serializer.setPrefix("a", Constant.ATTRIBUTE_NAMESPACE); serializer.startTag(Constant.ELEMENT_NAMESPACE, Constant.LOYALTY_CARDS_ELEMENT); serializer.attribute(Constant.ATTRIBUTE_NAMESPACE, Constant.VERSION_ATTRIBUTE, "1.0"); for (var card : cards) { writeCard(serializer, card); } serializer.endTag(Constant.ELEMENT_NAMESPACE, Constant.LOYALTY_CARDS_ELEMENT); serializer.endTag(null, Constant.ROOT_ELEMENT); } }