Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
4 changes: 2 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,8 @@ lazy val sdkJavaTestKit = project
//FIXME add scalasdk as package to tck, tck will test both java and scala sdk
lazy val tck = project
.in(file("tck"))
.dependsOn(sdkJava, sdkJavaTestKit % Test)
.enablePlugins(AkkaGrpcPlugin, PublicDockerImage)
.dependsOn(sdkJava, sdkJavaTestKit)
.enablePlugins(AkkaGrpcPlugin, PublicDockerImage, ReflectiveCodeGen)
.settings(
name := "akkaserverless-tck-java-sdk",
akkaGrpcGeneratedLanguages := Seq(AkkaGrpc.Java),
Expand Down
4 changes: 2 additions & 2 deletions project/Dependencies.scala
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,8 @@ object Dependencies {
val sdkScalaTestKit = deps ++= Seq(testContainers, logback % "test;provided")

val tck = deps ++= Seq(
akkaslsTckProtocol % "protobuf-src",
"com.akkaserverless" % "akkaserverless-tck-protocol" % AkkaServerless.FrameworkVersion % "protobuf-src",
//akkaslsTckProtocol % "protobuf-src",
Comment thread
jrudolph marked this conversation as resolved.
Outdated
//"com.akkaserverless" % "akkaserverless-tck-protocol" % AkkaServerless.FrameworkVersion % "protobuf-src",
"ch.qos.logback" % "logback-classic" % LogbackVersion)

val codegenCore = deps ++= Seq(
Expand Down
69 changes: 57 additions & 12 deletions project/ReflectiveCodeGen.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import sbt._
import sbt.Keys._
import sbt.Keys.streams

import sbtprotoc.ProtocPlugin
import ProtocPlugin.autoImport.PB
import akka.grpc.sbt.AkkaGrpcPlugin
import akka.grpc.sbt.AkkaGrpcPlugin.autoImport._
import sbt.internal.inc.classpath.ClasspathUtilities

import java.nio.file.{ Files, Path, Paths }

/**
* A plugin that allows to use a code generator compiled in one subproject to be used in a test project
*/
Expand All @@ -26,8 +27,9 @@ object ReflectiveCodeGen extends AutoPlugin {
def runAkkaServerlessCodegen(
classpath: Classpath,
protobufDescriptor: File,
srcDir: File,
genSrcDir: File,
testSrcManaged: File,
genTestSrcDir: File,
logger: Logger): Seq[File] = {

val cp = classpath.map(_.data)
Expand All @@ -42,24 +44,24 @@ object ReflectiveCodeGen extends AutoPlugin {
|import com.lightbend.akkasls.codegen.java.SourceGenerator
|import scala.collection.immutable
|
|(protobufDescriptor: java.io.File, genSrcDir: java.io.File, genTestSrcDir: java.io.File, logger: sbt.util.Logger) => {
|
|(protobufDescriptor: java.io.File, srcDir: java.io.File, genSrcDir: java.io.File, genTestSrcDir: java.io.File, logger: sbt.util.Logger) => {
Comment thread
jrudolph marked this conversation as resolved.
|
| val path = genSrcDir.toPath
| val testPath = genTestSrcDir.toPath
|
|
| implicit val codegenLog = new com.lightbend.akkasls.codegen.Log {
| override def debug(message: String): Unit = logger.debug(message)
| override def info(message: String): Unit = logger.info(message)
| }
|
|
| SourceGenerator
| .generate(protobufDescriptor, path, testPath, testPath, path, testPath, "com.example.Main")
| .generate(protobufDescriptor, srcDir.toPath, testPath, testPath, path, testPath, "com.example.Main")
| .map(_.toFile).to[immutable.Seq]
|}
|}
""".stripMargin

val generatorsF = tb.eval(tb.parse(source)).asInstanceOf[(File, File, File, sbt.util.Logger) => Seq[File]]
generatorsF(protobufDescriptor, genSrcDir, testSrcManaged, logger)
val generatorsF = tb.eval(tb.parse(source)).asInstanceOf[(File, File, File, File, sbt.util.Logger) => Seq[File]]
generatorsF(protobufDescriptor, srcDir, genSrcDir, genTestSrcDir, logger)

}

Expand All @@ -70,22 +72,65 @@ object ReflectiveCodeGen extends AutoPlugin {
val srcManaged = (Compile / sourceManaged).value
val testSrcManaged = (Test / sourceManaged).value
val sbtLogger = streams.value.log
runAkkaServerlessCodegen(cp, protobufDescriptorSetOut.value, srcManaged, testSrcManaged, sbtLogger)
runAkkaServerlessCodegen(
cp,
protobufDescriptorSetOut.value,
(Compile / temporaryUnmanagedDirectory).value,
srcManaged,
testSrcManaged,
sbtLogger)
.filterNot(_.getPath.contains("akkaserverless-unmanaged"))
}
.dependsOn(Compile / PB.generate)

lazy val protobufDescriptorSetOut = settingKey[File]("The file to write the protobuf descriptor set to")
val temporaryUnmanagedDirectory = settingKey[File]("Directory to generate 'unmanaged' sources into")
val generateUnmanaged = taskKey[Seq[File]](
"Generate \"unmanaged\" akkaserverless scaffolding code based on the available .proto definitions.\n" +
"These are the source files that are placed in the source tree, and after initial generation should typically be maintained by the user.\n" +
"Files that already exist they are not re-generated.")

lazy val attachProtobufDescriptorSets = Seq(
protobufDescriptorSetOut := (Compile / resourceManaged).value / "protobuf" / "descriptor-sets" / "user-function.desc",
Compile / PB.generate := (Compile / PB.generate)
.dependsOn(Def.task {
protobufDescriptorSetOut.value.getParentFile.mkdirs()
})
.value,
Compile / temporaryUnmanagedDirectory := (Compile / baseDirectory).value / "target" / "akkaserverless-unmanaged",
Compile / PB.protocOptions ++= Seq(
"--descriptor_set_out",
protobufDescriptorSetOut.value.getAbsolutePath,
"--include_source_info"),
Compile / managedResources += protobufDescriptorSetOut.value,
Compile / unmanagedResourceDirectories ++= (Compile / PB.protoSources).value)
Compile / unmanagedResourceDirectories ++= (Compile / PB.protoSources).value,
Compile / generateUnmanaged := {
Files.createDirectories(Paths.get((Compile / temporaryUnmanagedDirectory).value.toURI))
// Make sure generation has happened
val _ = (Compile / PB.generate).value
// Then copy over any new generated unmanaged sources
copyIfNotExist(
Paths.get((Compile / temporaryUnmanagedDirectory).value.toURI),
Paths.get((Compile / sourceDirectory).value.toURI).resolve("java")
) // FIXME: copy java and scala separately
},
Compile / unmanagedSources :=
(Compile / generateUnmanaged).value ++ (Compile / unmanagedSources).value)

// copied from AkkaserverlessPlugin.scala
private def copyIfNotExist(from: Path, to: Path): Seq[File] = {
Files
.walk(from)
.filter(Files.isRegularFile(_))
.flatMap[File](file => {
val target = to.resolve(from.relativize(file))
if (!Files.exists(target)) {
Files.createDirectories(target.getParent)
Files.copy(file, target)
java.util.stream.Stream.of[File](target.toFile)
} else java.util.stream.Stream.empty()
})
.toArray(new Array[File](_))
.toVector
}
}
32 changes: 14 additions & 18 deletions tck/src/main/java/com/akkaserverless/javasdk/tck/JavaSdkTck.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,6 @@
import com.akkaserverless.javasdk.eventsourcedentity.EventSourcedEntityOptions;
import com.akkaserverless.javasdk.replicatedentity.ReplicatedEntityOptions;
import com.akkaserverless.javasdk.replicatedentity.WriteConsistency;
import com.akkaserverless.javasdk.tck.model.action.ActionTckModelBehavior;
import com.akkaserverless.javasdk.tck.model.action.ActionTckModelBehaviorProvider;
import com.akkaserverless.javasdk.tck.model.action.ActionTwoBehavior;
import com.akkaserverless.javasdk.tck.model.action.ActionTwoBehaviorProvider;
import com.akkaserverless.javasdk.tck.model.eventsourcedentity.EventSourcedConfiguredEntity;
import com.akkaserverless.javasdk.tck.model.eventsourcedentity.EventSourcedConfiguredEntityProvider;
import com.akkaserverless.javasdk.tck.model.eventsourcedentity.EventSourcedTckModelEntity;
import com.akkaserverless.javasdk.tck.model.eventsourcedentity.EventSourcedTckModelEntityProvider;
import com.akkaserverless.javasdk.tck.model.eventsourcedentity.EventSourcedTwoEntity;
import com.akkaserverless.javasdk.tck.model.eventsourcedentity.EventSourcedTwoEntityProvider;
import com.akkaserverless.javasdk.tck.model.localpersistenceeventing.EventSourcedEntityOne;
import com.akkaserverless.javasdk.tck.model.localpersistenceeventing.EventSourcedEntityOneProvider;
import com.akkaserverless.javasdk.tck.model.localpersistenceeventing.EventSourcedEntityTwo;
Expand All @@ -47,25 +37,31 @@
import com.akkaserverless.javasdk.tck.model.replicatedentity.ReplicatedEntityTckModelEntityProvider;
import com.akkaserverless.javasdk.tck.model.replicatedentity.ReplicatedEntityTwoEntity;
import com.akkaserverless.javasdk.tck.model.replicatedentity.ReplicatedEntityTwoEntityProvider;
import com.akkaserverless.javasdk.tck.model.valueentity.ValueEntityConfiguredEntity;
import com.akkaserverless.javasdk.tck.model.valueentity.ValueEntityConfiguredEntityProvider;
import com.akkaserverless.javasdk.tck.model.valueentity.ValueEntityTckModelEntity;
import com.akkaserverless.javasdk.tck.model.valueentity.ValueEntityTckModelEntityProvider;
import com.akkaserverless.javasdk.tck.model.valueentity.ValueEntityTwoEntity;
import com.akkaserverless.javasdk.tck.model.valueentity.ValueEntityTwoEntityProvider;

import com.akkaserverless.javasdk.tck.model.view.ViewTckModelBehavior;
import com.akkaserverless.javasdk.tck.model.view.ViewTckModelBehaviorProvider;
import com.akkaserverless.javasdk.tck.model.view.ViewTckSourceEntity;
import com.akkaserverless.javasdk.tck.model.view.ViewTckSourceEntityProvider;
import com.akkaserverless.javasdk.valueentity.ValueEntityOptions;
import com.akkaserverless.tck.model.action.ActionTckModelActionProvider;
import com.akkaserverless.tck.model.action.ActionTwoActionProvider;
import com.akkaserverless.tck.model.action.ActionTckModelImpl;
import com.akkaserverless.tck.model.action.ActionTwoImpl;
import com.akkaserverless.tck.model.eventsourcedentity.EventSourcedConfiguredEntity;
import com.akkaserverless.tck.model.eventsourcedentity.EventSourcedConfiguredEntityProvider;
import com.akkaserverless.tck.model.eventsourcedentity.EventSourcedTckModelEntity;
import com.akkaserverless.tck.model.eventsourcedentity.EventSourcedTckModelEntityProvider;
import com.akkaserverless.tck.model.eventsourcedentity.EventSourcedTwoEntity;
import com.akkaserverless.tck.model.eventsourcedentity.EventSourcedTwoEntityProvider;
import com.akkaserverless.tck.model.valueentity.*;

import java.time.Duration;

public final class JavaSdkTck {
public static AkkaServerless SERVICE =
new AkkaServerless()
.register(ActionTckModelBehaviorProvider.of(ActionTckModelBehavior::new))
.register(ActionTwoBehaviorProvider.of(ActionTwoBehavior::new))
.register(ActionTckModelActionProvider.of(ActionTckModelImpl::new))
.register(ActionTwoActionProvider.of(ActionTwoImpl::new))
.register(ValueEntityTckModelEntityProvider.of(ValueEntityTckModelEntity::new))
.register(ValueEntityTwoEntityProvider.of(ValueEntityTwoEntity::new))
.register(
Expand Down

This file was deleted.

This file was deleted.

Loading