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