Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .jvmopts
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
-Xmx12g
-XX:+CMSClassUnloadingEnabled
-XX:+UseConcMarkSweepGC
4 changes: 2 additions & 2 deletions compile.sbt
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import org.clulab.sbt.Versioner
//import org.clulab.sbt.Versioner

// This setting adversely affects logLevel during tests, so needs counterweight.
// ThisBuild / Compile / logLevel := Level.Error
// ThisBuild / Runtime / logLevel := Level.Info
ThisBuild / Compile / scalacOptions ++= Seq("-feature", "-unchecked", "-deprecation")
Compile / sourceGenerators += Def.task {
import java.io.File
import Versioner._
//import Versioner._
// These values need to be collected in a task in order have them forwarded to Scala functions.
val versioner = Versioner(git.runner.value, git.gitCurrentBranch.value, baseDirectory.value, (Compile / sourceManaged).value)

Expand Down
5 changes: 3 additions & 2 deletions eidoscommon/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ resolvers ++= Seq(

libraryDependencies ++= {
// Versions were last checked 2021 Mar 12.
val procVer = "8.5.0"
val luceneVer = "6.6.6"
val procVer = "8.5.2-SNAPSHOT"
val luceneVer = "7.5.0" // Match processors!

// Run dependencyTree, dependencyList, and dependencyStats on eidos and
// see what kinds of duplicates with different version numbers show up.
Expand All @@ -21,6 +21,7 @@ libraryDependencies ++= {
// It is possible then that something using eidoscommons and something using
// eidos would get different answers.
"org.apache.lucene" % "lucene-analyzers-common" % luceneVer,
"org.apache.lucene" % "lucene-backward-codecs" % luceneVer,
"org.apache.lucene" % "lucene-core" % luceneVer,
"org.apache.lucene" % "lucene-queries" % luceneVer,
"org.apache.lucene" % "lucene-queryparser" % luceneVer,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,41 @@
package org.clulab.wm.eidoscommon.utils

import scala.language.reflectiveCalls
import scala.io.Source
import scala.language.implicitConversions
import scala.util.control.NonFatal

object Closer {

protected type Closeable = {def close() : Unit}
trait Releasable[Resource] {
def release(resource: Resource): Unit
}

object Releasable {

implicit def releasableAutoCloseable[Resource <: AutoCloseable]: Releasable[Resource] = {
new Releasable[Resource] {
def release(resource: Resource): Unit = resource.close()
}
}

def close[Resource <: Closeable](resource: => Resource): Unit = resource.close()
// In Scala 2.11, Source does not inherit from Closeable, so one has to tell Closer how to close() it.
implicit def releasableSource[Resource <: Source]: Releasable[Resource] = {
new Releasable[Resource] {
def release(resource: Resource): Unit = resource.close()
}
}
}

def close[Resource: Releasable](resource: => Resource): Unit =
implicitly[Releasable[Resource]].release(resource)

// This is so that exceptions caused during close are caught, but don't
// prevent the registration of any previous exception.
// See also https://medium.com/@dkomanov/scala-try-with-resources-735baad0fd7d.
// Others have resource: => Closeable, but I want the resource evaluated beforehand
// so that it doesn't throw an exception before there is anything to close.
def autoClose[Resource <: Closeable, Result](resource: Resource)(function: Resource => Result): Result = {
// 3 here is for the number of arguments. Operator overloading doesn't handle it.
protected def autoClose3[Resource, Result](resource: Resource)(closer: () => Unit)(function: Resource => Result): Result = {

val (result: Option[Result], exception: Option[Throwable]) = try {
(Some(function(resource)), None)
Expand All @@ -23,9 +44,9 @@ object Closer {
case exception: Throwable => (None, Some(exception))
}

val closeException: Option[Throwable] = Option(resource).flatMap { resource =>
val closeException: Option[Throwable] = Option(resource).flatMap { _ =>
try {
resource.close()
closer()
None
}
catch {
Expand Down Expand Up @@ -54,9 +75,12 @@ object Closer {
}
}

// Allow for alternative syntax closeable.autoClose { closeable => ... }
implicit class AutoCloser[Resource <: Closer.Closeable](resource: Resource) {
def autoClose[Resource: Releasable, Result](resource: Resource)(function: Resource => Result): Result =
autoClose3(resource)(() => implicitly[Releasable[Resource]].release(resource))(function)

implicit class AutoCloser[Resource: Releasable](resource: Resource) {

def autoClose[Result](function: Resource => Result): Result = Closer.autoClose(resource)(function)
def autoClose[Result](function: Resource => Result): Result =
Closer.autoClose(resource)(function)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.clulab.wm.eidoscommon.utils

import java.io.PrintWriter
import java.io.{Closeable, PrintWriter}

class EscapePair(char: Char, escaped: Char) {
val unescapedString: String = char.toString
Expand Down Expand Up @@ -74,7 +74,7 @@ class CsvReader() extends XsvReader(XsvUtils.commaChar) {
// TODO It is more complicated because of the multiple lines per string
}

abstract class XsvWriter(val printWriter: PrintWriter, separatorChar: Char) {
abstract class XsvWriter(val printWriter: PrintWriter, separatorChar: Char) extends Closeable {
protected val separatorString: String = separatorChar.toString

def quote(text: String): String = "\"" + text.replace("\"", "\"\"") + "\""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package org.clulab.wm.eidoscommon.utils

import org.clulab.wm.eidoscommon.utils.Closer.AutoCloser

import java.io.Closeable
import scala.io.Source

class TestAutoClosing extends Test {

class Closing(exception: Option[Throwable] = None) {
class Closing(exception: Option[Throwable] = None) extends Closeable {
var closed: Boolean = false // test

def close(): Unit = {
Expand Down Expand Up @@ -137,4 +140,9 @@ class TestAutoClosing extends Test {
}
closing.closed should be (false)
}

it should "work with a plain Source, even in Scala 2.11" in {
val source = Source.fromString("foo\nbar\n")
Closer.close(source)
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package org.clulab.wm.eidoscommon.utils


import org.clulab.utils.Closer.AutoCloser

import java.io.Closeable
import scala.io.Source

class TestCloser extends Test {

class Closing(exception: Option[Throwable] = None) {
class Closing(exception: Option[Throwable] = None) extends Closeable {
var closed: Boolean = false // test

def close(): Unit = {
Expand Down Expand Up @@ -135,4 +141,10 @@ class TestCloser extends Test {
}
closing.closed should be (false)
}

it should "work with a plain Source, even in Scala 2.11" in {
Source.fromString("foo\nbar\n").autoClose { source =>
source.getLines.toList
}
}
}
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
# Avoid "java.lang.OutOfMemoryError: Required array size too large" of 1.4+.
# Versions in the 1.3+ range seem to break the sbt-dependency-graph plugin and ivy-related things.
# Processors is at 1.2.8, the highest available 1.2.
sbt.version = 1.4.5
sbt.version = 1.6.2
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import org.clulab.wm.eidos.mentions.EidosMention
import org.clulab.wm.eidos.test.EnglishGroundingTest
import org.clulab.wm.eidos.test.TestUtils._

import scala.language.reflectiveCalls

class TestGrounding extends EnglishGroundingTest {
// Grounding needs to be activated in englishTest.conf for these tests to be active.
// Update: Grounding is now activated in EnglishTests by default.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@ import org.apache.http.impl.client.BasicCredentialsProvider
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClientBuilder

import java.io.Closeable
import java.net.URL

// See https://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html
// and https://mkyong.com/java/apache-httpclient-basic-authentication-examples/
// and https://stackoverflow.com/questions/2304663/apache-httpclient-making-multipart-form-post
class RestExchanger(service: String, username: String, password: String) {
class RestExchanger(service: String, username: String, password: String) extends Closeable {
protected val url = new URL(service)
protected val httpHost: HttpHost = newHttpHost(url)

Expand Down