Skip to content

Commit

Permalink
remove hard dependency on tools.logging
Browse files Browse the repository at this point in the history
  • Loading branch information
seancorfield committed Dec 16, 2023
1 parent d5e6488 commit b6db9f2
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 8 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
.calva/output-window
.classpath
.clj-kondo/.cache
.cpcache/
.lsp/.cache
.nrepl-port
.portal
.project
.settings
Expand Down
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
## Change Log

* Release 1.1.next in progress
* IMPORTANT: `org.clojure/tools.logging` is no longer a dependency. If you currently to bind `*to-java-object-missing-setter*` to `:log` and you do not otherwise have a dependency on `org.clojure/tools.logging` you will need to that to your project's direct dependencies.

* Release 1.0.95 on 2021-12-12
* Update to latest tools.logging 1.2.1
* Update `org.clojure/tools.logging` to `1.2.1`.

* Release 1.0.92 on 2021-10-16
* Support `to-java` for `java.util.Properties` and a hash map JDATA-22.
Expand Down
4 changes: 1 addition & 3 deletions deps.edn
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
{:paths ["src/main/clojure"]
:deps
{org.clojure/tools.logging {:mvn/version "1.2.1"}}}
{:paths ["src/main/clojure"]}
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<groupId>org.clojure</groupId>
<artifactId>tools.logging</artifactId>
<version>1.2.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
31 changes: 27 additions & 4 deletions src/main/clojure/clojure/java/data.clj
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,22 @@
^{:author "Cosmin Stejerean, Sean Corfield",
:doc "Support for recursively converting Java beans to Clojure and vice versa."}
clojure.java.data
(:require [clojure.string :as str]
[clojure.tools.logging :as logger]))
(:require [clojure.string :as str]))

(set! *warn-on-reflection* true)

(def ^:dynamic
*to-java-object-missing-setter*
"Specify the behavior of missing setters in to-java in the
default object case, using one of :ignore, :log, :error"
default object case, using one of :ignore, :log, :error
The default (:ignore) is to ignore missing setters.
* :log uses clojure.tools.logging/info to log a message.
* :error throws a NoSuchFieldException.
If you bind this to :log, you must have org.clojure/tools.logging
as a dependency in your project. Otherwise, :log will behave like
:error and throw a NoSuchFieldException."
:ignore)

(defmulti to-java
Expand Down Expand Up @@ -203,12 +210,28 @@
(.invoke (.getDeclaredMethod enum "valueOf" (into-array [String]))
nil (into-array [value])))

(declare log-or-throw)
(defmacro defn-log-or-throw []
(try
(require 'clojure.tools.logging)
`(defn ~'log-or-throw [message#]
(clojure.tools.logging/info message#))
(catch Throwable _
`(defn ~'log-or-throw [message#]
(throw (new NoSuchFieldException message#))))))
(defn-log-or-throw)

(defn- throw-log-or-ignore-missing-setter [key ^Class clazz]
(let [message (str "Missing setter for " key " in " (.getCanonicalName clazz))]
(cond (= *to-java-object-missing-setter* :error)
(throw (new NoSuchFieldException message))
(= *to-java-object-missing-setter* :log)
(logger/info message))))
(log-or-throw message))))

(comment
(binding [*to-java-object-missing-setter* :log]
(throw-log-or-ignore-missing-setter :foo String))
)

;; feature testing macro, based on suggestion from Chas Emerick:

Expand Down

0 comments on commit b6db9f2

Please sign in to comment.