From d231b8bd79bf81da09396b48e9a93021beca43af Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 25 Oct 2019 19:36:04 +0200
Subject: [PATCH] logger entries are translated to project log entries

---
 .../java/lcsb/mapviewer/model/LogMarker.java  | 72 +++++++++++++++++++
 .../mapviewer/model/map/species/Element.java  |  3 +
 .../services/impl/ProjectService.java         | 29 +++++++-
 .../services/impl/ProjectServiceTest.java     | 37 ++++++++--
 4 files changed, 132 insertions(+), 9 deletions(-)
 create mode 100644 model/src/main/java/lcsb/mapviewer/model/LogMarker.java

diff --git a/model/src/main/java/lcsb/mapviewer/model/LogMarker.java b/model/src/main/java/lcsb/mapviewer/model/LogMarker.java
new file mode 100644
index 0000000000..90379cee6d
--- /dev/null
+++ b/model/src/main/java/lcsb/mapviewer/model/LogMarker.java
@@ -0,0 +1,72 @@
+package lcsb.mapviewer.model;
+
+import org.apache.logging.log4j.Marker;
+
+import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.map.BioEntity;
+
+public class LogMarker implements Marker {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1L;
+
+  private ProjectLogEntry entry;
+
+  public LogMarker(String type, BioEntity bioEntity) {
+    entry = new ProjectLogEntry();
+    entry.setType(type);
+    if (bioEntity != null) {
+      entry.setObjectIdentifier(bioEntity.getElementId());
+      entry.setObjectClass(bioEntity.getClass().getSimpleName());
+      if (bioEntity.getModel() != null) {
+        entry.setMapName(bioEntity.getModel().getName());
+      }
+    }
+  }
+
+  @Override
+  public Marker addParents(Marker... markers) {
+    throw new NotImplementedException();
+  }
+
+  @Override
+  public String getName() {
+    throw new NotImplementedException();
+  }
+
+  @Override
+  public Marker[] getParents() {
+    throw new NotImplementedException();
+  }
+
+  @Override
+  public boolean hasParents() {
+    throw new NotImplementedException();
+  }
+
+  @Override
+  public boolean isInstanceOf(Marker m) {
+    throw new NotImplementedException();
+  }
+
+  @Override
+  public boolean isInstanceOf(String name) {
+    throw new NotImplementedException();
+  }
+
+  @Override
+  public boolean remove(Marker marker) {
+    throw new NotImplementedException();
+  }
+
+  @Override
+  public Marker setParents(Marker... markers) {
+    throw new NotImplementedException();
+  }
+
+  public ProjectLogEntry getEntry() {
+    return entry;
+  }
+}
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
index 77d6d22964..8cd0b748ae 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java
@@ -815,6 +815,9 @@ public abstract class Element implements BioEntity, Serializable, SbmlArgument {
   @XmlTransient
   @Override
   public Model getModel() {
+    if (model == null) {
+      return null;
+    }
     return model.getModel();
   }
 
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
index 71c3000adc..c73e0e47c9 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -9,6 +9,7 @@ import javax.mail.MessagingException;
 import org.apache.commons.io.FileUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LogEvent;
 import org.hibernate.HibernateException;
 import org.primefaces.model.DefaultTreeNode;
 import org.primefaces.model.TreeNode;
@@ -22,7 +23,6 @@ import lcsb.mapviewer.annotation.services.annotators.ElementAnnotator;
 import lcsb.mapviewer.commands.*;
 import lcsb.mapviewer.common.*;
 import lcsb.mapviewer.common.exception.InvalidArgumentException;
-import lcsb.mapviewer.common.exception.NotImplementedException;
 import lcsb.mapviewer.converter.*;
 import lcsb.mapviewer.converter.graphics.DrawingException;
 import lcsb.mapviewer.converter.graphics.MapGenerator;
@@ -1167,8 +1167,31 @@ public class ProjectService implements IProjectService {
     return project;
   }
 
-  private Set<ProjectLogEntry> createLogEntries(MinervaLoggerAppender appender) {
-    throw new NotImplementedException();
+  Set<ProjectLogEntry> createLogEntries(MinervaLoggerAppender appender) {
+    Set<ProjectLogEntry> result = new HashSet<>();
+    for (LogEvent event : appender.getWarnings()) {
+      result.add(createLogEntry("WARNING", event));
+    }
+    for (LogEvent event : appender.getErrors()) {
+      result.add(createLogEntry("ERROR", event));
+    }
+    return result;
+  }
+
+  private ProjectLogEntry createLogEntry(String severity, LogEvent event) {
+    ProjectLogEntry entry = null;
+    if (event.getMarker() != null) {
+      if (event.getMarker() instanceof LogMarker) {
+        entry = ((LogMarker) event.getMarker()).getEntry();
+      }
+    }
+    if (entry==null) {
+      entry = new ProjectLogEntry();
+      entry.setType("OTHER");
+    }
+    entry.setSeverity(severity);
+    entry.setContent(event.getMessage().getFormattedMessage());
+    return entry;
   }
 
 }
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
index 24281d4e6a..12182db251 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
@@ -8,8 +8,9 @@ import java.util.*;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.*;
+import org.apache.logging.log4j.core.impl.Log4jLogEvent;
+import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.poi.util.IOUtils;
 import org.junit.*;
 import org.mockito.Mockito;
@@ -18,20 +19,19 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.annotation.Rollback;
 
 import lcsb.mapviewer.commands.CopyCommand;
+import lcsb.mapviewer.common.MinervaLoggerAppender;
 import lcsb.mapviewer.converter.ComplexZipConverter;
 import lcsb.mapviewer.converter.ComplexZipConverterParams;
 import lcsb.mapviewer.converter.graphics.MapGenerator;
 import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
 import lcsb.mapviewer.converter.zip.*;
-import lcsb.mapviewer.model.Project;
-import lcsb.mapviewer.model.ProjectStatus;
+import lcsb.mapviewer.model.*;
 import lcsb.mapviewer.model.cache.UploadedFileEntry;
 import lcsb.mapviewer.model.map.*;
 import lcsb.mapviewer.model.map.layout.DataOverlayImageLayer;
 import lcsb.mapviewer.model.map.layout.Layout;
 import lcsb.mapviewer.model.map.model.*;
-import lcsb.mapviewer.model.map.species.Element;
-import lcsb.mapviewer.model.map.species.Protein;
+import lcsb.mapviewer.model.map.species.*;
 import lcsb.mapviewer.model.user.*;
 import lcsb.mapviewer.persist.dao.ProjectDao;
 import lcsb.mapviewer.persist.dao.map.LayoutDao;
@@ -657,4 +657,29 @@ public class ProjectServiceTest extends ServiceTestFunctions {
     assertEquals(ProjectStatus.FAIL, project.getStatus());
     projectService.removeProject(project, null, false);
   }
+
+  @Test
+  public void testCreateLogEntries() throws Exception {
+    Protein protein = new GenericProtein("id");
+    MinervaLoggerAppender appender = MinervaLoggerAppender.createAppender();
+    appender.append(Log4jLogEvent.newBuilder()
+        .setLevel(Level.WARN)
+        .setMessage(new SimpleMessage("Hello world"))
+        .setMarker(new LogMarker("type", protein))
+        .build());
+    appender.append(Log4jLogEvent.newBuilder()
+        .setLevel(Level.ERROR)
+        .setMessage(new SimpleMessage("Hello world 2"))
+        .setMarker(new LogMarker("type2", protein))
+        .build());
+    appender.append(Log4jLogEvent.newBuilder()
+        .setLevel(Level.ERROR)
+        .setMessage(new SimpleMessage("Hello world 3"))
+        .build());
+
+    ProjectService service = Mockito.mock(ProjectService.class, Mockito.CALLS_REAL_METHODS);
+    Set<ProjectLogEntry> entries = service.createLogEntries(appender);
+    assertEquals(3, entries.size());
+  }
+
 }
-- 
GitLab