Skip to content
Snippets Groups Projects
Commit 44da6c7c authored by Nicolay Schiøll-Johansen's avatar Nicolay Schiøll-Johansen
Browse files

Merge branch 'feat/metadata-formatting' into 'dev'

Add MetadataStringFormatter to present metadata in UI

See merge request !153
parents 1b684a2b 8fbc6400
No related branches found
No related tags found
2 merge requests!165Weekly merge to Master,!153Add MetadataStringFormatter to present metadata in UI
Pipeline #80613 failed
......@@ -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>
......
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();
}
}
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
......
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment