Skip to content

Commit

Permalink
Merge pull request #613 from mrdziuban/customize-jaxb-package
Browse files Browse the repository at this point in the history
Support choosing `javax` or `jakarta` for jaxb package name
  • Loading branch information
eed3si9n committed Oct 4, 2023
2 parents d38b007 + 9b22226 commit eadcf3e
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 3 deletions.
2 changes: 1 addition & 1 deletion cli/src/main/resources/scalaxb.scala.template
Expand Up @@ -3,7 +3,7 @@ package scalaxb
import scala.xml.{Node, NodeSeq, NamespaceBinding, Elem}
import javax.xml.datatype.XMLGregorianCalendar
import javax.xml.namespace.QName
import javax.xml.bind.DatatypeConverter
import %%JAXB_PACKAGE%%.xml.bind.DatatypeConverter

import scala.language.implicitConversions

Expand Down
19 changes: 19 additions & 0 deletions cli/src/main/scala/scalaxb/compiler/Config.scala
Expand Up @@ -86,6 +86,7 @@ case class Config(items: Map[String, ConfigEntry]) {
def symbolEncodingStrategy = get[SymbolEncoding.Strategy] getOrElse defaultSymbolEncodingStrategy
def enumNameMaxLength: Int = (get[EnumNameMaxLength] getOrElse defaultEnumNameMaxLength).value
def useLists: Boolean = values contains UseLists
def jaxbPackage = get[JaxbPackage] getOrElse defaultJaxbPackage

private def get[A <: ConfigEntry: Manifest]: Option[A] =
items.get(implicitly[Manifest[A]].runtimeClass.getName).asInstanceOf[Option[A]]
Expand Down Expand Up @@ -115,6 +116,7 @@ object Config {
val defaultGigahorseBackend = GigahorseBackend(scalaxb.BuildInfo.defaultGigahorseBackend)
val defaultSymbolEncodingStrategy = SymbolEncoding.Legacy151
val defaultEnumNameMaxLength = EnumNameMaxLength(50)
val defaultJaxbPackage = JaxbPackage.Javax

val default = Config(
Vector(defaultPackageNames, defaultOpOutputWrapperPostfix, defaultOutdir,
Expand Down Expand Up @@ -195,4 +197,21 @@ object ConfigEntry {

private[compiler] implicit val scoptRead: scopt.Read[Strategy] = scopt.Read.reads(withName)
}

sealed abstract class JaxbPackage(val packageName: String) extends ConfigEntry with Product with Serializable {
final override def name: String = classOf[JaxbPackage].getName
}
object JaxbPackage {
case object Javax extends JaxbPackage("javax")
case object Jakarta extends JaxbPackage("jakarta")

val values = Seq(Javax, Jakarta)

def apply(packageName: String): Option[JaxbPackage] = values.find(_.packageName == packageName)
def withPackageName(packageName: String): JaxbPackage = apply(packageName).getOrElse {
throw new IllegalArgumentException(s"""Unknown jaxb package "${packageName}"; possible values are ${values.map(_.packageName).mkString(", ")}.""")
}

private[compiler] implicit val scoptRead: scopt.Read[JaxbPackage] = scopt.Read.reads(withPackageName)
}
}
5 changes: 5 additions & 0 deletions cli/src/main/scala/scalaxb/compiler/Main.scala
Expand Up @@ -152,6 +152,11 @@ object Arguments {
.action { (strategy, config) => config.update(strategy) }
opt[Int]("enum-name-max-length") valueName("<length>") text("truncates names of enum members longer than this value (default: 50)") action { (x, c) =>
c.update(EnumNameMaxLength(x)) }
opt[JaxbPackage]("jaxb-package")
.valueName("<package>")
.text(s"Specifies the jaxb package to use in generated code. Defaults to ${Config.defaultJaxbPackage.packageName}." +
JaxbPackage.values.map(p => s"${p.packageName}").mkString(", "))
.action { (pkg, config) => config.update(pkg) }

opt[Unit]('v', "verbose") text("be extra verbose") action { (_, c) =>
verbose = true
Expand Down
2 changes: 1 addition & 1 deletion cli/src/main/scala/scalaxb/compiler/wsdl11/Driver.scala
Expand Up @@ -213,7 +213,7 @@ class Driver extends Module { driver =>

def generateRuntimeFiles[To](cntxt: Context, config: Config)(implicit evTo: CanBeWriter[To]): List[To] =
List(
generateFromResource[To](Some("scalaxb"), "scalaxb.scala", "/scalaxb.scala.template"),
generateFromResource[To](Some("scalaxb"), "scalaxb.scala", "/scalaxb.scala.template", Some("%%JAXB_PACKAGE%%" -> config.jaxbPackage.packageName)),
(config.httpClientStyle match {
case HttpClientStyle.Sync => generateFromResource[To](Some("scalaxb"), "httpclients.scala", "/httpclients.scala.template")
case HttpClientStyle.Future => generateFromResource[To](Some("scalaxb"), "httpclients_async.scala", "/httpclients_async.scala.template")
Expand Down
2 changes: 1 addition & 1 deletion cli/src/main/scala/scalaxb/compiler/xsd/Driver.scala
Expand Up @@ -81,7 +81,7 @@ class Driver extends Module { driver =>

def generateRuntimeFiles[To](cntxt: Context, config: Config)(implicit evTo: CanBeWriter[To]): List[To] =
List(
generateFromResource[To](Some("scalaxb"), "scalaxb.scala", "/scalaxb.scala.template")
generateFromResource[To](Some("scalaxb"), "scalaxb.scala", "/scalaxb.scala.template", Some("%%JAXB_PACKAGE%%" -> config.jaxbPackage.packageName))
) ++
(if (config.generateVisitor) List(generateFromResource[To](Some("scalaxb"), "Visitor.scala", "/visitor.scala.template"))
else Nil) ++
Expand Down
6 changes: 6 additions & 0 deletions sbt-scalaxb/src/main/scala/sbtscalaxb/ScalaxbKeys.scala
Expand Up @@ -52,6 +52,7 @@ trait ScalaxbKeys {
lazy val scalaxbSymbolEncodingStrategy = settingKey[SymbolEncodingStrategy.Value]("Specifies the strategy to encode non-identifier characters in generated class names")
lazy val scalaxbEnumNameMaxLength = settingKey[Int]("Truncates names of enum members longer than this value (default: 50)")
lazy val scalaxbUseLists = settingKey[Boolean]("Declare sequences with concrete type List instead of Seq")
lazy val scalaxbJaxbPackage = settingKey[JaxbPackage.Value]("Specifies the jaxb package name to use in generated code")

object HttpClientType extends Enumeration {
val None, Dispatch, Gigahorse, Http4s = Value
Expand All @@ -74,5 +75,10 @@ trait ScalaxbKeys {
val DecimalAscii = Value("decimal-ascii")
val Legacy151 = Value("legacy-1.5.1")
}

object JaxbPackage extends Enumeration {
val Javax = Value("javax")
val Jakarta = Value("jakarta")
}
}
object ScalaxbKeys extends ScalaxbKeys
2 changes: 2 additions & 0 deletions sbt-scalaxb/src/main/scala/sbtscalaxb/ScalaxbPlugin.scala
Expand Up @@ -51,6 +51,7 @@ object ScalaxbPlugin extends sbt.AutoPlugin {
scalaxbEnumNameMaxLength := 50,
scalaxbUseLists := false,
scalaxbAsync := true,
scalaxbJaxbPackage := JaxbPackage.Javax,
)

override lazy val projectSettings: Seq[Def.Setting[_]] =
Expand Down Expand Up @@ -155,6 +156,7 @@ object ScalaxbPlugin extends sbt.AutoPlugin {
Vector(EnumNameMaxLength(scalaxbEnumNameMaxLength.value)) ++
(if (scalaxbMapK.value) Vector(GenerateMapK) else Vector()) ++
(if (scalaxbUseLists.value) Vector(UseLists) else Vector()) ++
Vector(ConfigEntry.JaxbPackage.withPackageName(scalaxbJaxbPackage.value.toString)) ++
Vector(scalaxbHttpClientStyle.value match {
case HttpClientStyle.Sync => ConfigEntry.HttpClientStyle.Sync
case HttpClientStyle.Future => ConfigEntry.HttpClientStyle.Future
Expand Down

0 comments on commit eadcf3e

Please sign in to comment.