diff --git a/README.md b/README.md
index c4a81f77..77cefc59 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ easily comprehensible for the user and allows an intuitive manual correction if
The PAGE XML format is used to support integration into existing OCR workflows.
Evaluations showed that LAREX provides an efficient and flexible way to segment pages of early printed books.
-Please feel free to visit the [tool homepage](https://www.uni-wuerzburg.de/zpd/larex/). A short user manual is available [here](http://www.is.informatik.uni-wuerzburg.de/fileadmin/10030600/Mitarbeiter/Reul_Christian/Projects/Layout_Analysis/LAREX_Quick_Guide.pdf).
+Please feel free to visit the [tool homepage](https://www.uni-wuerzburg.de/zpd/larex/). A short user manual is available [here](https://www.ocr4all.org/guide/user-guide/workflow#segmentation-%E2%80%93-larex).
## Table of Contents
- [Installation](#installation)
diff --git a/pom.xml b/pom.xml
index 93d6696e..5726a7e3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
de.uniwue
@@ -16,6 +17,8 @@
1.8
5.2.22.RELEASE
3.2.8
+ 1.5.6
+ 2.1.0-alpha1
5.6.2
@@ -59,6 +62,19 @@
compile
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ org.slf4j
+ slf4j-api
+ ${log.sl4j.version}
+
+
+
com.github.jai-imageio
@@ -219,4 +235,4 @@
-
+
\ No newline at end of file
diff --git a/src/main/java/de/uniwue/web/config/LarexConfiguration.java b/src/main/java/de/uniwue/web/config/LarexConfiguration.java
index 27650a0a..721c1691 100644
--- a/src/main/java/de/uniwue/web/config/LarexConfiguration.java
+++ b/src/main/java/de/uniwue/web/config/LarexConfiguration.java
@@ -3,6 +3,8 @@
import java.io.*;
import java.util.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@@ -15,6 +17,9 @@
@Scope("session")
public class LarexConfiguration {
+
+ static Logger logger = LoggerFactory.getLogger(LarexConfiguration.class);
+ private String configurationFile;
private Map configurations;
/**
@@ -26,6 +31,7 @@ public class LarexConfiguration {
public void read(File configuration) {
configurations = new HashMap<>();
try {
+ this.configurationFile = configuration.getAbsolutePath();
FileReader input = new FileReader(configuration);
Properties prop = new Properties();
prop.load(input);
@@ -49,7 +55,7 @@ public void read(File configuration) {
*/
public String getSetting(String setting) {
if (!isInitiated()) {
- System.err.println("Configuration file has not been read.");
+ logger.error("Configuration {} has not been read, return empty String", this.configurationFile);
return "";
}
return configurations.getOrDefault(setting, "");
@@ -64,7 +70,7 @@ public String getSetting(String setting) {
*/
public List getListSetting(String setting) {
if (!isInitiated()) {
- System.err.println("Configuration file has not been read.");
+ logger.error("Configuration {} has not been read, return empty List", this.configurationFile);
return new ArrayList<>();
}
if (configurations.containsKey(setting)) {
@@ -83,7 +89,7 @@ public List getListSetting(String setting) {
*/
public void setSetting(String setting, String value) {
if (!isInitiated()) {
- System.err.println("Configuration file has not been read.");
+ logger.error("Configuration {} has not been read, set empty Map", this.configurationFile);
this.configurations = new HashMap();
}
configurations.put(setting, value);
diff --git a/src/main/java/de/uniwue/web/controller/FileController.java b/src/main/java/de/uniwue/web/controller/FileController.java
index e03a109f..3b2889ed 100644
--- a/src/main/java/de/uniwue/web/controller/FileController.java
+++ b/src/main/java/de/uniwue/web/controller/FileController.java
@@ -26,6 +26,8 @@
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.HttpHeaders;
@@ -62,6 +64,9 @@
@Controller
@Scope("session")
public class FileController {
+
+ static Logger logger = LoggerFactory.getLogger(FileController.class);
+
@Autowired
private ServletContext servletContext;
@Autowired
@@ -406,7 +411,8 @@ private File getXMLFilePath(String xmlName, Integer bookid){
if(!savedir.endsWith(File.separator)) { savedir += File.separator; }
return new File(savedir + xmlName);
} else {
- System.err.println("Warning: Save dir is not set. File could not been saved.");
+ logger.error("Warning: Save dir {} not set. File {} could not been saved.",
+ savedir, xmlName);
}
} else {
return new File(fileManager.getLocalXmlMap().get(xmlName.split("\\.")[0]));
diff --git a/src/main/java/de/uniwue/web/controller/LibraryController.java b/src/main/java/de/uniwue/web/controller/LibraryController.java
index 8680c24c..8a8af688 100644
--- a/src/main/java/de/uniwue/web/controller/LibraryController.java
+++ b/src/main/java/de/uniwue/web/controller/LibraryController.java
@@ -10,6 +10,9 @@
import de.uniwue.web.communication.DirectRequest;
import de.uniwue.web.config.Constants;
import de.uniwue.web.io.MetsReader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@@ -31,6 +34,11 @@
@Controller
@Scope("request")
public class LibraryController {
+
+ public static final String ENV_LAREX_VERSION = "LAREX_VERSION";
+
+ static Logger logger = LoggerFactory.getLogger(LibraryController.class);
+
@Autowired
private ServletContext servletContext;
@Autowired
@@ -80,8 +88,8 @@ public String home(Model model) throws IOException {
}
File bookPath = new File(fileManager.getLocalBooksPath());
if (!bookPath.isDirectory()) {
- System.err.println("ERROR:\tSpecified bookpath is not a directory");
- System.err.println("\tPlease set a valid bookpath in larex.properties");
+ logger.error("Specified bookpath {} not a directory. Please set a valid bookpath in larex.properties!",
+ bookPath);
return "redirect:/500";
}
FileDatabase database = new FileDatabase(bookPath, config.getListSetting("imagefilter"), false);
@@ -89,6 +97,7 @@ public String home(Model model) throws IOException {
model.addAttribute("library", lib);
model.addAttribute("timeStamp", timeStamp);
+ logger.info("Start LAREX using {}", this.fileManager.getConfigurationFile());
return "lib";
}
@@ -120,7 +129,7 @@ public String home(Model model) throws IOException {
case "flat":
return getFileMap(baseFolder.getAbsolutePath(), Constants.IMG_EXTENSIONS_DOTTED);
default:
- System.out.println("Attempting to open empty directory");
+ logger.error("Attempt opening empty directory {}", baseFolder.getAbsolutePath());
break;
}
} catch (Exception e) {
@@ -162,8 +171,13 @@ public String home(Model model) throws IOException {
*/
@RequestMapping(value = "library/getOldRequest", method = RequestMethod.POST, headers = "Accept=*/*")
public @ResponseBody DirectRequest getOldRequest() {
- return fileManager.getDirectRequest();
+ DirectRequest directRequest = this.fileManager.getDirectRequest();
+ if (directRequest != null) {
+ logger.info("Pass last {}", directRequest.getMetsPath());
+ }
+ return directRequest;
}
+
/**
* returns each imagePath in given directory
* respecting the SubExtensionFilter set in properties
@@ -219,7 +233,11 @@ public Map> getFileMap(String baseFolder, List extL
@RequestMapping(value ="library/getVersion" , method = RequestMethod.GET)
public @ResponseBody
String getVersion() {
- String larex_version = System.getenv("LAREX_VERSION");
- return larex_version.equals("") ? "UNKNOWN" : larex_version;
+ String larexVersion = System.getenv(ENV_LAREX_VERSION);
+ if (larexVersion == null) {
+ logger.warn("LAREX_VERSION unset in Env");
+ larexVersion = "";
+ }
+ return "".equals(larexVersion) ? "UNKNOWN" : larexVersion;
}
}
diff --git a/src/main/java/de/uniwue/web/controller/ViewerController.java b/src/main/java/de/uniwue/web/controller/ViewerController.java
index c817c5db..eb337590 100644
--- a/src/main/java/de/uniwue/web/controller/ViewerController.java
+++ b/src/main/java/de/uniwue/web/controller/ViewerController.java
@@ -13,6 +13,9 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import de.uniwue.web.communication.DirectRequest;
import de.uniwue.web.io.MetsReader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@@ -35,6 +38,9 @@
@Controller
@Scope("request")
public class ViewerController {
+
+ static Logger logger = LoggerFactory.getLogger(ViewerController.class);
+
@Autowired
private ServletContext servletContext;
@Autowired
@@ -99,8 +105,7 @@ public String direct(Model model,
}
mimeMap = mapper.readValue(java.net.URLDecoder.decode(mimeMapString, StandardCharsets.UTF_8.name()), TreeMap.class);
} catch (IOException e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
+ logger.error("Internal Exception {}", e.getMessage());
return "redirect:/error/500";
}
if(customFlag.equals("true") && !customFolder.endsWith(File.separator)) { customFolder += File.separator; }
diff --git a/src/main/java/de/uniwue/web/facade/segmentation/LarexFacade.java b/src/main/java/de/uniwue/web/facade/segmentation/LarexFacade.java
index 8a1c9578..b3de2cde 100644
--- a/src/main/java/de/uniwue/web/facade/segmentation/LarexFacade.java
+++ b/src/main/java/de/uniwue/web/facade/segmentation/LarexFacade.java
@@ -13,6 +13,8 @@
import de.uniwue.web.model.*;
import org.opencv.core.Mat;
import org.opencv.core.Size;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
@@ -32,6 +34,8 @@
*/
public class LarexFacade {
+ static Logger logger = LoggerFactory.getLogger(LarexFacade.class);
+
/**
* Segment a page with the LAREX segmentation algorithm
*
@@ -82,11 +86,9 @@ public static PageAnnotations segmentPage(SegmentationSettings settings, int pag
MemoryCleaner.clean(original);
segmentationResult = result;
} else {
- System.err.println(
- "Warning: Image file could not be found. Segmentation result will be empty. File: " + imagePath);
+ logger.warn("Image file {} could not be found. Segmentation will be empty!", imagePath);
}
// TODO fix metadata insertion here instead of frontend (?)
-
page.setOrientation(orientation);
if (segmentationResult != null) {
segmentation = new PageAnnotations(page.getName(), page.getXmlName(), page.getWidth(), page.getHeight(),
diff --git a/src/main/java/de/uniwue/web/io/FileDatabase.java b/src/main/java/de/uniwue/web/io/FileDatabase.java
index e48de585..393e9036 100644
--- a/src/main/java/de/uniwue/web/io/FileDatabase.java
+++ b/src/main/java/de/uniwue/web/io/FileDatabase.java
@@ -8,6 +8,8 @@
import de.uniwue.web.config.Constants;
import org.apache.commons.io.FilenameUtils;
import org.opencv.core.Size;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import de.uniwue.web.model.Book;
import de.uniwue.web.model.Page;
@@ -38,6 +40,8 @@
*/
public class FileDatabase {
+ static Logger logger = LoggerFactory.getLogger(FileDatabase.class);
+
private Map books;
private File databaseFolder;
private List supportedFileExtensions;
@@ -68,7 +72,8 @@ public class FileDatabase {
* @param supportedFileExtensions supported image types to load
* @param imageSubFilter file extensions that are to be filtered
*/
- public FileDatabase(File databaseFolder, List supportedFileExtensions, List imageSubFilter, Boolean isFlat) {
+ public FileDatabase(File databaseFolder, List supportedFileExtensions, List imageSubFilter,
+ Boolean isFlat) {
this.databaseFolder = databaseFolder;
this.books = new HashMap();
this.supportedFileExtensions = new ArrayList(supportedFileExtensions);
@@ -144,23 +149,23 @@ public Map> listBooks() {
public String checkType(File bookfolder) {
File[] metsFiles = bookfolder.listFiles((d, name) -> name.endsWith("mets.xml"));
List imgFileList = new ArrayList<>();
- for(String ext : supportedFileExtensions) {
+ for (String ext : supportedFileExtensions) {
imgFileList.addAll(Arrays.asList(bookfolder.listFiles((d, name) -> name.endsWith(ext))));
}
File[] imgFiles = imgFileList.toArray(new File[0]);
- if( metsFiles.length != 0) {
+ if (metsFiles.length != 0) {
return "mets";
- } else if(imgFiles.length != 0) {
+ } else if (imgFiles.length != 0) {
return "flat";
} else {
- //try ./data/mets.xml
+ // try ./data/mets.xml
File dataFolder = new File(bookfolder.getAbsolutePath() + File.separator + "data");
- if(dataFolder.exists() && dataFolder.isDirectory()) {
+ if (dataFolder.exists() && dataFolder.isDirectory()) {
metsFiles = dataFolder.listFiles((d, name) -> name.endsWith("mets.xml"));
- if( metsFiles.length != 0) {
+ if (metsFiles.length != 0) {
return "mets-data";
} else {
- System.out.println("data folder exists but contains no mets");
+ logger.warn("Data folder {} exists but contains no METS", dataFolder.getAbsolutePath());
}
}
return "empty";
@@ -208,12 +213,13 @@ public Book getBook(int id) {
* Load a book object via Map.
*
* @param bookName name of book
- * @param bookID Identifier of the book to load
+ * @param bookID Identifier of the book to load
* @param imageMap map of images from book
* @return Loaded book
*/
- public Book getBook(String bookName, Integer bookID, Map> imageMap, Map xmlMap) {
- return readBook(bookName,imageMap, xmlMap, bookID);
+ public Book getBook(String bookName, Integer bookID, Map> imageMap,
+ Map xmlMap) {
+ return readBook(bookName, imageMap, xmlMap, bookID);
}
/**
@@ -256,14 +262,16 @@ public Collection getPagesWithAnnotations(int bookID) {
* @return Collection of all book pages in the selected book with a segmentation
* file
*/
- public Collection getPagesWithAnnotations(String bookName, Integer bookID, Map> imageMap, Map xmlMap) {
+ public Collection getPagesWithAnnotations(String bookName, Integer bookID,
+ Map> imageMap, Map xmlMap) {
Collection segmentedIds = new HashSet<>();
try {
- Book book = getBook(bookName,bookID,imageMap, xmlMap);
+ Book book = getBook(bookName, bookID, imageMap, xmlMap);
for (Page page : book.getPages()) {
String key = page.getName();
String xmlKey = page.getXmlName().split("\\.")[0];
- if ((xmlMap.get(key) != null && new File(xmlMap.get(key)).exists()) || (xmlMap.get(xmlKey) != null && new File(xmlMap.get(xmlKey)).exists())) {
+ if ((xmlMap.get(key) != null && new File(xmlMap.get(key)).exists())
+ || (xmlMap.get(xmlKey) != null && new File(xmlMap.get(xmlKey)).exists())) {
segmentedIds.add(page.getId());
}
@@ -288,16 +296,18 @@ private Book readBook(File bookFile, int bookID) {
LinkedList pages = new LinkedList();
int pageCounter = 0;
- if(imageSubFilter.isEmpty()) {
+ if (imageSubFilter.isEmpty()) {
// Interpret every image as its own page
List imageFiles = Arrays.stream(Objects.requireNonNull(bookFile.listFiles()))
- .filter(this::isSupportedImage).sorted(Comparator.comparing(File::getName)).collect(Collectors.toList());
+ .filter(this::isSupportedImage).sorted(Comparator.comparing(File::getName))
+ .collect(Collectors.toList());
- for(File imageFile: imageFiles) {
+ for (File imageFile : imageFiles) {
Size imageSize = ImageLoader.readDimensions(imageFile);
String name = removeAllExtensions(imageFile.getName());
String imageURL = bookName + File.separator + imageFile.getName();
- pages.add(new Page(pageCounter++, name, name + ".xml", Collections.singletonList(imageURL), (int) imageSize.width, (int) imageSize.height, 0.0));
+ pages.add(new Page(pageCounter++, name, name + ".xml", Collections.singletonList(imageURL),
+ (int) imageSize.width, (int) imageSize.height, 0.0));
}
} else {
@@ -315,13 +325,13 @@ private Book readBook(File bookFile, int bookID) {
List images = new ArrayList<>();
Size imageSize = null;
- for(String subExtension: imageSubFilter) {
+ for (String subExtension : imageSubFilter) {
List subImages = !subExtension.equals(".") ? groupedImages.get(subExtension)
- : groupedImages.get("");
+ : groupedImages.get("");
- if(subImages != null) {
- for(File subImage: subImages) {
- if(imageSize == null) {
+ if (subImages != null) {
+ for (File subImage : subImages) {
+ if (imageSize == null) {
imageSize = ImageLoader.readDimensions(subImage);
}
images.add(bookName + File.separator + subImage.getName());
@@ -330,7 +340,8 @@ private Book readBook(File bookFile, int bookID) {
}
assert imageSize != null;
- pages.add(new Page(pageCounter++, pageName, pageName + ".xml", images, (int) imageSize.width, (int) imageSize.height, 0.0));
+ pages.add(new Page(pageCounter++, pageName, pageName + ".xml", images, (int) imageSize.width,
+ (int) imageSize.height, 0.0));
}
}
@@ -345,17 +356,18 @@ private Book readBook(File bookFile, int bookID) {
* @param bookID Identifier that is to be used for the loaded book
* @return
*/
- private Book readBook(String bookName, Map> imagemap, Map xmlMap, int bookID) {
- try{
+ private Book readBook(String bookName, Map> imagemap, Map xmlMap, int bookID) {
+ try {
LinkedList pages = new LinkedList();
int pageCounter = 0;
- for(Entry> imgEntry: imagemap.entrySet()) {
+ for (Entry> imgEntry : imagemap.entrySet()) {
File imageFile = new File(imgEntry.getValue().get(0));
Size imageSize = ImageLoader.readDimensions(imageFile);
String name = removeAllExtensions(imageFile.getName());
String xmlName = (new File(xmlMap.get(imgEntry.getKey()))).getName();
- if(isSupportedImage(imageFile)) {
- pages.add(new Page(pageCounter++, name, xmlName, imgEntry.getValue(), (int) imageSize.width, (int) imageSize.height));
+ if (isSupportedImage(imageFile)) {
+ pages.add(new Page(pageCounter++, name, xmlName, imgEntry.getValue(), (int) imageSize.width,
+ (int) imageSize.height));
}
}
return new Book(bookID, bookName, pages);
@@ -419,13 +431,13 @@ private String removeAllExtensions(String filename) {
if (passesSubFilter(filename)) {
final int extPointPos = filename.lastIndexOf(".");
final int subExtPointPos = filename.lastIndexOf(".", extPointPos - 1);
- if(subExtPointPos > 0)
+ if (subExtPointPos > 0)
return filename.substring(0, subExtPointPos);
else
return filename.substring(0, extPointPos);
} else {
final int extensionPointer = filename.lastIndexOf(".");
- if(extensionPointer > 0)
+ if (extensionPointer > 0)
return filename.substring(0, extensionPointer);
}
diff --git a/src/main/java/de/uniwue/web/io/PageXMLReader.java b/src/main/java/de/uniwue/web/io/PageXMLReader.java
index 21eccf24..aee4475f 100644
--- a/src/main/java/de/uniwue/web/io/PageXMLReader.java
+++ b/src/main/java/de/uniwue/web/io/PageXMLReader.java
@@ -1,6 +1,7 @@
package de.uniwue.web.io;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -28,6 +29,8 @@
import org.primaresearch.shared.variable.IntegerValue;
import org.primaresearch.shared.variable.IntegerVariable;
import org.primaresearch.shared.variable.Variable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import de.uniwue.algorithm.geometry.regions.type.PAGERegionType;
import de.uniwue.algorithm.geometry.regions.type.RegionSubType;
@@ -60,6 +63,8 @@
*/
public class PageXMLReader {
+ static Logger logger = LoggerFactory.getLogger(PageXMLReader.class);
+
/**
* Read a document to extract the PageAnnotations
*
@@ -78,8 +83,7 @@ public static PageAnnotations getPageAnnotations(File sourceFilename){
fixFaultyPAGE(sourceFilename);
page = readPAGE(sourceFilename);
}catch (ParserConfigurationException | IOException | SAXException | XPathExpressionException e) {
- e.printStackTrace();
- System.err.println("Could not load source PAGE XML file: " + sourceFilename);
+ logger.error("Could not load source PAGE XML file {}: {}", sourceFilename, e.getMessage());
}
}
@@ -233,12 +237,13 @@ public static PageAnnotations getPageAnnotations(File sourceFilename){
public static Page readPAGE(File sourceFilename){
Page page = null;
try{
+ if (! sourceFilename.exists()) {
+ throw new FileNotFoundException(sourceFilename.getAbsolutePath());
+ }
page = PageXmlInputOutput.readPage(String.valueOf(sourceFilename));
}catch(Exception e){
- e.printStackTrace();
- System.err.println("Could not load source PAGE XML file: " + sourceFilename);
+ logger.error("Could not load source PAGE XML file {}: {} ", sourceFilename, e.getMessage());
}
-
return page;
}
@@ -311,8 +316,7 @@ public static PageAnnotations loadPageAnnotationsFromDisc(File pageXMLInputPath)
try {
segResult = getPageAnnotations(pageXMLInputPath);
} catch (Exception e) {
- e.printStackTrace();
- System.err.println("Reading XML file failed!");
+ logger.error("Failed to read {}: {}", pageXMLInputPath, e.getMessage());
}
return segResult;
diff --git a/src/main/java/de/uniwue/web/io/SegmentationSettingsReader.java b/src/main/java/de/uniwue/web/io/SegmentationSettingsReader.java
index ae2436c3..c94d1379 100644
--- a/src/main/java/de/uniwue/web/io/SegmentationSettingsReader.java
+++ b/src/main/java/de/uniwue/web/io/SegmentationSettingsReader.java
@@ -4,6 +4,8 @@
import java.util.Collection;
import java.util.HashSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -20,6 +22,9 @@
* Parameters for the segmentation steps.
*/
public class SegmentationSettingsReader {
+
+ static Logger logger = LoggerFactory.getLogger(SegmentationSettingsReader.class);
+
/**
* Read a settingsfile from a document into Parameters
*
@@ -37,8 +42,7 @@ public static Parameters loadSettings(Document document) {
RegionManager regionmanager = extractRegions(regionNodes);
parameters = extractParameters(parameterElement, regionmanager);
} catch (Exception e) {
- e.printStackTrace();
- System.out.println("Reading XML file failed!");
+ logger.error("Failed to process {}: {}", document.getDocumentURI(), e.getMessage());
}
return parameters;
}
diff --git a/src/main/java/de/uniwue/web/model/PageAnnotations.java b/src/main/java/de/uniwue/web/model/PageAnnotations.java
index d502e57b..a2f12f3b 100644
--- a/src/main/java/de/uniwue/web/model/PageAnnotations.java
+++ b/src/main/java/de/uniwue/web/model/PageAnnotations.java
@@ -1,12 +1,14 @@
package de.uniwue.web.model;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -19,6 +21,9 @@
* segment polygons.
*/
public class PageAnnotations {
+
+ static Logger logger = LoggerFactory.getLogger(PageAnnotations.class);
+
/**
* Name of the page (does not include image extensions)
* Does not include sub extensions if imageSubFilter is active
@@ -181,9 +186,8 @@ private static void checkNameValidity(String name) {
final List imageExtensions = Constants.IMG_EXTENSIONS_DOTTED;
for (String ext : imageExtensions) {
if(name.toLowerCase().endsWith(ext))
- System.err.println("[Warning] Page name '"+name+"' ends with an image extension ('"+ext+"').\n"+
- "\tThis should not happen unless '"+ext+"' is part of the page name.\n"+
- "\te.g. '"+name+".png'");
+ logger.error("Page {} ends with image extension ({}). This should not happen unless it's part of the page name, i.e. {}.png",
+ name, ext, name);
}
}
diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml
new file mode 100644
index 00000000..2bc938ef
--- /dev/null
+++ b/src/main/resources/logback.xml
@@ -0,0 +1,23 @@
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} [%-5level][%logger{36}] %msg%n
+
+
+
+ ${user.home}/larex.log
+ true
+
+ %d{yyyy-MM-dd HH:mm:ss} [%-5level][%logger{36}] %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/de/uniwue/web/io/TestPageXMLReader.java b/src/test/java/de/uniwue/web/io/TestPageXMLReader.java
index 68b7185d..43088871 100644
--- a/src/test/java/de/uniwue/web/io/TestPageXMLReader.java
+++ b/src/test/java/de/uniwue/web/io/TestPageXMLReader.java
@@ -2,6 +2,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.nio.file.Files;
@@ -16,6 +17,9 @@
*/
public class TestPageXMLReader {
+ /**
+ * Ensure Legacy validated Transkribus format read as expected
+ */
@Test
public void testReadTranskribusPAGE2013() {
// arrange
@@ -31,4 +35,13 @@ public void testReadTranskribusPAGE2013() {
assertEquals(34, readPage.getLayout().getRegionCount());
}
+ /**
+ * Test behavior if invalid sourceFilename=Null used
+ */
+ @Test
+ public void testNullpointerInputFile() {
+
+ assertNull(PageXMLReader.readPAGE(null));
+ }
+
}