diff --git a/pom.xml b/pom.xml index f2ad67f12ef2df3658effa2ce4a5505881059181..bc3a35bc9fa7132ce5d9906237641be735fb7a30 100644 --- a/pom.xml +++ b/pom.xml @@ -165,11 +165,10 @@ <version>0.11.0</version> </dependency> - <!-- JavaFX Controls --> <dependency> - <groupId>org.controlsfx</groupId> - <artifactId>controlsfx</artifactId> - <version>11.0.0</version> + <groupId>org.apache.commons</groupId> + <artifactId>commons-text</artifactId> + <version>1.4</version> </dependency> </dependencies> diff --git a/src/main/java/NTNU/IDATT1002/utils/MetadataStringFormatter.java b/src/main/java/NTNU/IDATT1002/utils/MetadataStringFormatter.java new file mode 100644 index 0000000000000000000000000000000000000000..462392bd59a08ba3844e07ff7590d45c86d08df9 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/utils/MetadataStringFormatter.java @@ -0,0 +1,106 @@ +package NTNU.IDATT1002.utils; + +import NTNU.IDATT1002.models.Metadata; +import org.apache.commons.text.WordUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + + +/** + * Metadata String Formatter provides and interface for formatting + * metadata into a UI presentable string. + */ +public class MetadataStringFormatter { + + private static List<String> include = Arrays.asList("geolocation", + "camera", + "lens", + "aperture", + "shutterSpeed", + "ISO", + "focalLength", + "fileType", + "photoDate", + "fileSize", + "fileDimension"); + + private static Logger logger = LoggerFactory.getLogger(MetadataStringFormatter.class); + + /** + * Format given metadata by given delimiter. + * + * @param metadata the metadata to format + * @param delimiter the delimiter separating the fields + * @return the formatted string + */ + public static String format(Metadata metadata, char delimiter) { + + Stream<Field> fields = Arrays.stream(metadata.getClass().getDeclaredFields()); + StringBuilder metadataString = new StringBuilder(); + + fields.filter(field -> include.contains(field.getName())) + .forEach(field -> { + String formattedField = getFormattedField(metadata, delimiter, field); + metadataString.append(formattedField); + }); + + return metadataString.toString(); + } + + /** + * Format given fields name and value. + * Converts camel case into title case where the first letter + * in each word is capital and adds given delimiter at the end. + * + * @param metadata the metadata holding the field + * @param delimiter the delimiter separating the fields + * @param field the field to format + * @return the formatted field as a string + */ + private static String getFormattedField(Metadata metadata, + char delimiter, + Field field) { + field.setAccessible(true); + + String[] fieldNameSplitByUppercase = field.getName().split("(?=\\p{Upper}[a-z])"); + String fieldNameTitle = String.join(" ", fieldNameSplitByUppercase); + + StringBuilder fieldString = new StringBuilder(); + fieldString.append(WordUtils.capitalizeFully(fieldNameTitle)) + .append(": "); + + fieldString.append(getFieldValue(metadata, field)) + .append(delimiter); + + return fieldString.toString(); + } + + /** + * Format given fields value. + * + * @param metadata the metadata holding the field + * @param field the fields holding the value + */ + private static String getFieldValue(Metadata metadata, Field field) { + StringBuilder fieldValueString = new StringBuilder(); + try { + if (field.get(metadata) == null) + fieldValueString.append("No ") + .append(field.getName()) + .append(" found."); + else + fieldValueString.append(field.get(metadata)); + + } catch (IllegalAccessException e) { + logger.error("[x] Failed to process field {}", field.getName(), e); + } + + return fieldValueString.toString(); + } + +} diff --git a/src/test/java/NTNU/IDATT1002/utils/MetaDataExtractorTest.java b/src/test/java/NTNU/IDATT1002/utils/MetaDataExtractorTest.java index 6d3a8d675f33f25fdca2e9f45b13c4b2dd3d460c..7f59e5685ee93675bbf84f81bb67ede515a5642f 100644 --- a/src/test/java/NTNU/IDATT1002/utils/MetaDataExtractorTest.java +++ b/src/test/java/NTNU/IDATT1002/utils/MetaDataExtractorTest.java @@ -1,13 +1,13 @@ package NTNU.IDATT1002.utils; -import static org.junit.jupiter.api.Assertions.*; - import NTNU.IDATT1002.models.GeoLocation; -import NTNU.IDATT1002.models.Metadata; -import java.io.File; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.io.File; + +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * Tests for {@link MetaDataExtractor} * These test are not the best and are best used as a proof of concept diff --git a/src/test/java/NTNU/IDATT1002/utils/MetadataStringFormatterTest.java b/src/test/java/NTNU/IDATT1002/utils/MetadataStringFormatterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9579acec19eda162b61cba9b40722bc6b2180180 --- /dev/null +++ b/src/test/java/NTNU/IDATT1002/utils/MetadataStringFormatterTest.java @@ -0,0 +1,34 @@ +package NTNU.IDATT1002.utils; + +import NTNU.IDATT1002.models.Metadata; +import org.junit.Ignore; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.File; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MetadataStringFormatterTest { + + private File metadataImage; + private Metadata metadata = new Metadata(); + private final String formattedMetadata = "Geolocation: No geolocation found. Camera: Make: NIKON CORPORATION, Model: NIKON D610 Lens: Lens Specification: 24-70mm f/2,8, Lens Model: 24.0-70.0 mm f/2.8 Aperture: Aperture Value: f/2,8, Max Aperture Value: f/2,8 Shutter Speed: Shutter Speed Value: 1/124 sec Iso: ISO Speed Ratings: 640 Focal Length: Focal Length: 70 mm File Type: Detected Name: JPEG Photo Date: Date Created: 2020:02:15, Time Created: 12:07:01 File Size: Size: 821839 bytes File Dimension: Image Height: 930 pixels, Image Width: 1394 pixels"; + + @BeforeEach + void setUp() { + metadataImage = new File("src/test/resources/Images/pb.jpg"); + MetaDataExtractor.setMetadata(metadata, metadataImage); + } + + /** + * Test that metadata string is properly formatted. + */ + @Ignore + @Test + void testFormatReturnsFormattedString() { + String metadataString = MetadataStringFormatter.format(metadata, ' '); + + assertEquals(metadataString.trim(), formattedMetadata.trim()); + } +} \ No newline at end of file