All Downloads are FREE. Search and download functionalities are using the official Maven repository.

controllers.io.MediaWikiCtrl.scala Maven / Gradle / Ivy

The newest version!
package controllers.io

import java.net.{MalformedURLException, URL, URLDecoder}
import java.nio.charset.StandardCharsets
import javax.inject.Inject

import com.mohiva.play.silhouette.api.Environment
import com.mohiva.play.silhouette.impl.authenticators.CookieAuthenticator
import controllers.{ResultFormat, ViewContext}
import models.{PCMAPIUtils, User}
import org.opencompare.api.java.PCMFactory
import org.opencompare.api.java.impl.PCMFactoryImpl
import org.opencompare.io.wikipedia.io.{MediaWikiAPI, WikiTextExporter, WikiTextLoader, WikiTextTemplateProcessor}
import play.api.data.Form
import play.api.data.Forms._
import play.api.i18n.MessagesApi
import play.api.libs.json.Json
import play.api.mvc._

import scala.collection.JavaConversions._

/**
 * Created by gbecan on 8/18/15.
 */
class MediaWikiCtrl @Inject() (
                                val messagesApi: MessagesApi,
                                val env: Environment[User, CookieAuthenticator],
                                val pcmAPIUtils : PCMAPIUtils) extends IOCtrl("mediawiki") {

  val inputParametersForm = Form(
    mapping(
      "url" -> nonEmptyText
    )(MediaWikiImportParameters.apply)(MediaWikiImportParameters.unapply)
  )

  val outputParametersForm = Form(
    mapping(
      "productAsLines" -> boolean,
      "file" -> text
    )(MediaWikiExportParameters.apply)(MediaWikiExportParameters.unapply)
  )
  private val pcmFactory: PCMFactory = new PCMFactoryImpl
  private val mediaWikiAPI: MediaWikiAPI = new MediaWikiAPI("wikipedia.org")
  private val wikitextTemplateProcessor: WikiTextTemplateProcessor = new WikiTextTemplateProcessor(mediaWikiAPI)
  private val miner: WikiTextLoader = new WikiTextLoader(wikitextTemplateProcessor)

  private val wikiExporter: WikiTextExporter = new WikiTextExporter(true)

  override def importPCMs(format : ResultFormat)(implicit request: Request[AnyContent], viewContext: ViewContext) : Result = {

    val parameters = inputParametersForm.bindFromRequest.get
    val url = parameters.url

    try {
      val pageURL = new URL(url)
      val host = pageURL.getHost
      val language = host.substring(0, host.indexOf('.'))
      var file = URLDecoder.decode(pageURL.getFile, StandardCharsets.UTF_8.name)
      if (file.endsWith("/")) {
        file = file.substring(0, file.length - 1)
      }
      val title = file.substring(file.lastIndexOf('/') + 1)


      // Parse article from Wikipedia
      val code = mediaWikiAPI.getWikitextFromTitle(language, title)

      val pcmContainers = miner.mine(language, code, title).toList
      for (pcmContainer <- pcmContainers) {
        pcmContainer.getMetadata.setSource(url)
        if (url.contains("wikipedia.org")) {
          pcmContainer.getMetadata.setLicense("Creative Commons Attribution-ShareAlike 3.0 Unported")
        }
      }


      if (pcmContainers.isEmpty) {
        NotFound("No matrices were found in this Wikipedia page")
      } else {

        val jsonResult = postprocessContainers(pcmContainers)

        Ok(jsonResult)
      }
    }
    catch {
      case e: MalformedURLException => NotFound("URL is not a valid Wikipedia page")
      case e: Exception => NotFound("The page has not been found.") // TODO: manage the different kind of exceptions
    }

  }

  override def exportPCM(implicit request : Request[AnyContent]) : Result = {
    val parameters = outputParametersForm.bindFromRequest.get
    val pcmJSON = Json.parse(parameters.pcm)

    val container = pcmAPIUtils.parsePCMContainers(pcmJSON).head
    container.getMetadata.setProductAsLines(parameters.productAsLines)

    val wikitext = wikiExporter.export(container)
    
    Ok(wikitext)
  }

}


case class MediaWikiImportParameters(
                                url : String
                                )

case class MediaWikiExportParameters(
                                productAsLines : Boolean,
                                pcm : String
                                )




© 2015 - 2025 Weber Informatics LLC | Privacy Policy