From 38a63427bdcd6636a857b497a8cddf3e04623031 Mon Sep 17 00:00:00 2001
From: Richard Alam <ritzalam@gmail.com>
Date: Fri, 1 Sep 2017 10:34:01 -0700
Subject: [PATCH]  - start implement metadata xml reader

---
 .../bigbluebutton/api2/domain/Recording.scala |  4 +
 .../bigbluebutton/api2/util/LogHelper.scala   | 13 +++
 .../api2/util/RecMetaXmlHelper.scala          | 47 +++++++++++
 .../RecordingMetadataReaderHelperTest.scala   | 79 -------------------
 .../api/util/RecordingServiceTest.scala       | 77 ------------------
 .../api2/util/RecMetaXmlHelperTests.scala     | 31 ++++++++
 6 files changed, 95 insertions(+), 156 deletions(-)
 create mode 100755 bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala
 create mode 100755 bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/LogHelper.scala
 create mode 100755 bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala
 delete mode 100755 bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingMetadataReaderHelperTest.scala
 delete mode 100755 bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingServiceTest.scala
 create mode 100755 bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala

diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala
new file mode 100755
index 0000000000..f3798b1e77
--- /dev/null
+++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/domain/Recording.scala
@@ -0,0 +1,4 @@
+package org.bigbluebutton.api2.domain
+
+case class Extensions(extensions: scala.xml.NodeSeq)
+case class RecMetaImage(width: String, height: String, alt: String, link: String)
diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/LogHelper.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/LogHelper.scala
new file mode 100755
index 0000000000..deeb5833a3
--- /dev/null
+++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/LogHelper.scala
@@ -0,0 +1,13 @@
+package org.bigbluebutton.api2.util
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+/**
+  * LogHelper is a trait you can mix in to provide easy log4j logging
+  * for your scala classes.
+  **/
+trait LogHelper {
+  val loggerName = this.getClass.getName
+  lazy val logger = LoggerFactory.getLogger(this.getClass)
+}
diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala
new file mode 100755
index 0000000000..c6e5efd7e8
--- /dev/null
+++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/util/RecMetaXmlHelper.scala
@@ -0,0 +1,47 @@
+package org.bigbluebutton.api2.util
+
+import java.io.IOException
+
+import scala.xml.{Elem, NodeSeq, XML}
+
+object RecMetaXmlHelper extends LogHelper {
+
+  def loadMetadataXml(path: String): Option[Elem] = {
+    try {
+      val xml = XML.loadFile(path)
+      Some(xml)
+    } catch {
+      case ioe: IOException =>
+        logger.info("Failed to load metadataxml {}", path)
+        None
+      case ex: Exception =>
+        logger.info("Exception while loading {}", path)
+        logger.info("Exception details: {}", ex.getMessage)
+        None
+    }
+  }
+
+  def getExtensions(playbackXml: Elem): Option[NodeSeq] = {
+    val extensions = playbackXml \ "extensions"
+    if (extensions.isEmpty) None
+    else Some(extensions)
+  }
+
+  def getMeta(metaXml: Elem): Option[scala.collection.immutable.Map[String, String]] = {
+    val meta = (metaXml \ "meta")
+
+    if (meta.nonEmpty) {
+      // result has some #PCDATA entries which we don't want. Filter them out.
+      val nonPCData = meta.head.nonEmptyChildren filter (p => p.label != "#PCDATA")
+
+      val metaMap = nonPCData map { f =>
+        f.label -> f.text
+      } toMap
+
+      Some(metaMap)
+    } else {
+      None
+    }
+
+  }
+}
diff --git a/bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingMetadataReaderHelperTest.scala b/bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingMetadataReaderHelperTest.scala
deleted file mode 100755
index 793315435b..0000000000
--- a/bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingMetadataReaderHelperTest.scala
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.bigbluebutton.api.util
-
-import java.io.{File, FileInputStream}
-import javax.xml.stream.{XMLInputFactory, XMLStreamReader}
-
-import com.fasterxml.jackson.dataformat.xml.{JacksonXmlModule, XmlMapper}
-import org.bigbluebutton.api.domain.{RecordingMetadata, RecordingMetadataPlayback}
-
-class RecordingMetadataReaderHelperTest extends UnitSpec {
-
-  it should "deserialize playback part of metadata.xml" in {
-    val factory: XMLInputFactory  = XMLInputFactory.newInstance();
-
-    val xml = new File("src/test/resources/playback-metadata.xml")
-    val module: JacksonXmlModule  = new JacksonXmlModule();
-    // and then configure, for example:
-    module.setDefaultUseWrapper(false);
-
-    val mapper: XmlMapper = new XmlMapper(module)
-
-    //Reading from xml file and creating XMLStreamReader
-    val reader: XMLStreamReader  = factory.createXMLStreamReader(new FileInputStream(xml))
-
-    val playback: RecordingMetadataPlayback = mapper.readValue(reader, classOf[RecordingMetadataPlayback])
-
-    //println("***** FOOO =" + mapper.writeValueAsString(playback))
-
-    assert(playback.getDuration == 545949)
-
-  }
-
-  it should "deserialize metadata.xml" in {
-    val factory: XMLInputFactory  = XMLInputFactory.newInstance();
-
-    val xml = new File("src/test/resources/breakout-room-metadata.xml")
-    val module: JacksonXmlModule  = new JacksonXmlModule();
-    // and then configure, for example:
-    module.setDefaultUseWrapper(false);
-
-    val mapper: XmlMapper = new XmlMapper(module)
-
-    //Reading from xml file and creating XMLStreamReader
-    val reader: XMLStreamReader  = factory.createXMLStreamReader(new FileInputStream(xml))
-
-    val recMeta: RecordingMetadata = mapper.readValue(reader, classOf[RecordingMetadata])
-
-    //println("***** FOOO =" + mapper.writeValueAsString(recMeta))
-
-    //assert(recMeta.getPlayback.getDuration == 126376)
-    assert(true)
-  }
-
-  it should "save metadata.xml" in {
-    val factory: XMLInputFactory  = XMLInputFactory.newInstance();
-
-    val xml = new File("src/test/resources/breakout-room-metadata.xml")
-    val module: JacksonXmlModule  = new JacksonXmlModule();
-    // and then configure, for example:
-    module.setDefaultUseWrapper(false);
-
-    val mapper: XmlMapper = new XmlMapper(module)
-
-    //Reading from xml file and creating XMLStreamReader
-    val reader: XMLStreamReader  = factory.createXMLStreamReader(new FileInputStream(xml))
-
-    val recMeta: RecordingMetadata = mapper.readValue(reader, classOf[RecordingMetadata])
-
-    recMeta.getMeta().set("FOO", "BAR");
-
-    val metadataXml = RecordingMetadataReaderHelper.getMetadataXmlLocation("target")
-    if (metadataXml.exists()) metadataXml.delete()
-
-    RecordingMetadataReaderHelper.saveRecordingMetadata(metadataXml, recMeta)
-
-    assert(metadataXml.exists())
-
-  }
-
-}
diff --git a/bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingServiceTest.scala b/bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingServiceTest.scala
deleted file mode 100755
index 5df5d60afe..0000000000
--- a/bbb-common-web/src/test/scala/org/bigbluebutton/api/util/RecordingServiceTest.scala
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.bigbluebutton.api.util
-
-import java.io.File
-import java.util
-
-import org.apache.commons.io.FileUtils
-import org.bigbluebutton.api.RecordingService
-
-class RecordingServiceTest extends UnitSpec {
-
-  it should "deserialize playback part of metadata.xml" in {
-    val srcXml = new File("src/test/resources/breakout-room-metadata.xml")
-    val metaParams: util.Map[String, String] = new util.TreeMap[String, String]()
-
-    metaParams.put("foo", "bar")
-    metaParams.put("bar", "baz")
-
-    val destXml = new File("target/updated-metadata.xml")
-    RecordingService.updateRecordingMetadata(srcXml, metaParams, destXml)
-  }
-
-  it should "publish recording" in {
-    // Make a copy of our sample recording
-    val destDir = new File("target/sample-recording/publish")
-    if (destDir.exists()) FileUtils.deleteDirectory(destDir)
-
-    val srcDir = new File("src/test/resources/sample-recording")
-    FileUtils.copyDirectory(srcDir, destDir)
-
-    val recordingId = "foo"
-    val recordingDir = new File(destDir.getPath() + File.separatorChar + recordingId)
-
-    val publishedDir = new File("target/recording/published")
-    RecordingService.publishRecording(publishedDir, recordingId, recordingDir, "presentation")
-
-    assert(true)
-  }
-
-  it should "unpublish recording" in {
-    // Make a copy of our sample recording
-    val destDir = new File("target/sample-recording/unpublish")
-    if (destDir.exists()) FileUtils.deleteDirectory(destDir)
-
-    val srcDir = new File("src/test/resources/sample-recording")
-    FileUtils.copyDirectory(srcDir, destDir)
-
-    val recordingId = "foo"
-    val recordingDir = new File(destDir.getPath() + File.separatorChar + recordingId)
-
-    val unpublishedDir = new File("target/recording/unpublished")
-    if (unpublishedDir.exists()) FileUtils.deleteDirectory(unpublishedDir)
-
-    RecordingService.unpublishRecording(unpublishedDir, recordingId, recordingDir, "presentation")
-
-    assert(unpublishedDir.exists())
-  }
-
-  it should "delete recording" in {
-    // Make a copy of our sample recording
-    val destDir = new File("target/sample-recording/delete")
-    if (destDir.exists()) FileUtils.deleteDirectory(destDir)
-
-    val srcDir = new File("src/test/resources/sample-recording")
-    FileUtils.copyDirectory(srcDir, destDir)
-
-    val recordingId = "foo"
-    val recordingDir = new File(destDir.getPath() + File.separatorChar + recordingId)
-
-    val deletedDir = new File("target/recording/deleted")
-    if (deletedDir.exists()) FileUtils.deleteDirectory(deletedDir)
-
-    RecordingService.deleteRecording(deletedDir, recordingId, recordingDir, "presentation")
-
-    assert(deletedDir.exists())
-  }
-
-}
diff --git a/bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala b/bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala
new file mode 100755
index 0000000000..4e5f425efa
--- /dev/null
+++ b/bbb-common-web/src/test/scala/org/bigbluebutton/api2/util/RecMetaXmlHelperTests.scala
@@ -0,0 +1,31 @@
+package org.bigbluebutton.api2.util
+
+import org.bigbluebutton.api.util.UnitSpec
+
+class RecMetaXmlHelperTests extends UnitSpec {
+
+  val metaFile = "src/test/resources/sample-metadata.xml"
+
+  it should "load metadata xml" in {
+   val xml = RecMetaXmlHelper.loadMetadataXml(metaFile)
+    println("METADATAXML = \n" + xml)
+  }
+
+  it should "get meta elements" in {
+    val xml = RecMetaXmlHelper.loadMetadataXml(metaFile)
+    xml match {
+      case Some(metaXml) =>
+        RecMetaXmlHelper.getMeta(metaXml) match {
+          case Some(meta) =>
+            assert(meta.size == 8)
+          case None => fail("Failed to get meta element.")
+        }
+
+      case None => fail("Failed to load metadata.xml")
+    }
+  }
+
+  it should "get extensions" in {
+    val xml =
+  }
+}
-- 
GitLab