diff --git a/src/main/java/voruti/json2config/service/Appender.java b/src/main/java/voruti/json2config/service/Appender.java index 2edf23d..36f1911 100644 --- a/src/main/java/voruti/json2config/service/Appender.java +++ b/src/main/java/voruti/json2config/service/Appender.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -10,12 +11,57 @@ import lombok.extern.slf4j.Slf4j; import voruti.json2config.model.IAppendable; +/** + * Common code for appending channel links and metadata to items + * + * @author sbholmes + * + */ @Slf4j public class Appender { private Appender() { } + /** + * Appends data found in {@code appendableList} onto the end of items in the {@code directory} + * + * @param directory the directory in which to search for ".items" files + * @param appendableList the list of data that needs appending to items + */ + public static void searchAndAppend(String directory, List appendableList) { + // search items files: + List itemsFiles = Appender.findItemsFilesInDir(directory); + // get names of all items: + List itemNamesList = itemsFiles.stream() + .map(Appender::getItemNamesFromFile) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + log.info("Found {} items", itemNamesList.size()); + log.trace("itemNamesList={}", itemNamesList); + + // only data present in both lists: + List relevantDataList = appendableList.stream() + .filter(data -> itemNamesList.stream() + .anyMatch(itemName -> itemName.equals(data.getItemName()))) + .collect(Collectors.toList()); + log.info("{} match with each other", relevantDataList.size()); + log.trace("relevantDataList={}", relevantDataList); + + // append the right data to the right item + int count = 0; + for (IAppendable appendable : relevantDataList) { + for (String iFile : itemsFiles) { + if (Appender.appendToItemInFile(appendable, iFile)) { + count++; + } + } + } + log.info("Successfully appended {} channels/metadata!", count); + + log.warn("Warning: You might need to manually fix some converting mistakes (double channels, etc.)"); + } + /** * Returns a {@link List} of Strings containing the names of all items in * {@code fileName}. diff --git a/src/main/java/voruti/json2config/service/ChannelAppender.java b/src/main/java/voruti/json2config/service/ChannelAppender.java index 4fec199..35156dd 100644 --- a/src/main/java/voruti/json2config/service/ChannelAppender.java +++ b/src/main/java/voruti/json2config/service/ChannelAppender.java @@ -1,11 +1,11 @@ package voruti.json2config.service; import java.io.IOException; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import voruti.json2config.model.IAppendable; import voruti.json2config.model.json.JsonChannelLink; /** @@ -17,13 +17,11 @@ public class ChannelAppender { private ChannelAppender() { } - /** * Appends the channel links from {@code channelLinkFile} to all ".items" files * in the {@code directory}. * - * @param channelLinkFile path to the file which contains the channel links in - * JSON format + * @param channelLinkFile path to the file which contains the channel links in JSON format * @param directory the directory in which to search for ".items" files */ public static void start(String channelLinkFile, String directory) { @@ -33,41 +31,14 @@ public static void start(String channelLinkFile, String directory) { // open file: String content = SharedService.openFileToString(channelLinkFile); // map to list of channel links: - List channelLinkList = SharedService.jsonToConvertibleMap(content, Type.CHANNEL).values().stream() + List channelLinkList = SharedService.jsonToConvertibleMap(content, Type.CHANNEL).values().stream() .map(JsonChannelLink.class::cast) .collect(Collectors.toList()); log.info("Found {} channel links", channelLinkList.size()); log.trace("channelLinkList={}", channelLinkList); - // search items files: - List itemsFiles = Appender.findItemsFilesInDir(directory); - // get names of all items: - List itemNamesList = itemsFiles.stream() - .map(Appender::getItemNamesFromFile) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - log.info("Found {} items", itemNamesList.size()); - log.trace("itemNamesList={}", itemNamesList); - - // only channels present in both lists: - List relevantChannelLinkList = channelLinkList.stream() - .filter(channelLink -> itemNamesList.stream() - .anyMatch(itemName -> itemName.equals(channelLink.getValue().getItemName()))) - .collect(Collectors.toList()); - log.info("{} match with each other", relevantChannelLinkList.size()); - log.trace("relevantChannelLinkList={}", relevantChannelLinkList); - - int count = 0; - for (JsonChannelLink channel : relevantChannelLinkList) { - for (String iFile : itemsFiles) { - if (Appender.appendToItemInFile(channel, iFile)) { - count++; - } - } - } - log.info("Successfully appended {} channel links!", count); + Appender.searchAndAppend(directory, channelLinkList); - log.warn("Warning: You might need to manually fix some converting mistakes (double channels, etc.)"); } catch (IOException e) { log.error(Constants.LOG_CANT_OPEN_FILE, channelLinkFile); } diff --git a/src/main/java/voruti/json2config/service/MetadataAppender.java b/src/main/java/voruti/json2config/service/MetadataAppender.java index bab05b0..06a52bd 100644 --- a/src/main/java/voruti/json2config/service/MetadataAppender.java +++ b/src/main/java/voruti/json2config/service/MetadataAppender.java @@ -1,11 +1,11 @@ package voruti.json2config.service; import java.io.IOException; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import voruti.json2config.model.IAppendable; import voruti.json2config.model.json.JsonMetadata; /** @@ -32,39 +32,13 @@ public static void start(String metadataFile, String directory) { // open file: String content = SharedService.openFileToString(metadataFile); // map to list of metadata: - List metadataList = SharedService.jsonToConvertibleMap(content, Type.METADATA).values().stream() + List metadataList = SharedService.jsonToConvertibleMap(content, Type.METADATA).values().stream() .map(JsonMetadata.class::cast) .collect(Collectors.toList()); log.info("Found {} metadata", metadataList.size()); log.trace("metadataList={}", metadataList); - // search items files: - List itemsFiles = Appender.findItemsFilesInDir(directory); - // get names of all items: - List itemNamesList = itemsFiles.stream() - .map(Appender::getItemNamesFromFile) - .flatMap(Collection::stream) - .collect(Collectors.toList()); - log.info("Found {} items", itemNamesList.size()); - log.trace("itemNamesList={}", itemNamesList); - - // only metadata present in both lists: - List relevantMetadataList = metadataList.stream() - .filter(metadata -> itemNamesList.stream() - .anyMatch(itemName -> itemName.equals(metadata.getItemName()))) - .collect(Collectors.toList()); - log.info("{} match with each other", relevantMetadataList.size()); - log.trace("relevantMetadataList={}", relevantMetadataList); - - int count = 0; - for (JsonMetadata metadata : relevantMetadataList) { - for (String iFile : itemsFiles) { - if (Appender.appendToItemInFile(metadata, iFile)) { - count++; - } - } - } - log.info("Successfully appended {} metadata!", count); + Appender.searchAndAppend(directory, metadataList); } catch (IOException e) { log.error(Constants.LOG_CANT_OPEN_FILE, metadataFile);