Skip to content

Commit f65d51c

Browse files
committed
prepare release v0.8.0
1 parent 3c860e4 commit f65d51c

File tree

23 files changed

+194
-78
lines changed

23 files changed

+194
-78
lines changed

build.sbt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ ThisBuild / organization := "app.softnetwork"
22

33
name := "resource"
44

5-
ThisBuild / version := "0.7.0"
5+
ThisBuild / version := "0.8.0"
66

77
ThisBuild / scalaVersion := "2.12.18"
88

@@ -34,6 +34,13 @@ lazy val common = project.in(file("common"))
3434
.settings(Defaults.itSettings)
3535
.enablePlugins(AkkaGrpcPlugin)
3636

37+
lazy val local = project.in(file("local"))
38+
.configs(IntegrationTest)
39+
.settings(Defaults.itSettings)
40+
.dependsOn(
41+
common % "compile->compile;test->test;it->it"
42+
)
43+
3744
lazy val core = project.in(file("core"))
3845
.configs(IntegrationTest)
3946
.settings(Defaults.itSettings, app.softnetwork.Info.infoSettings)
@@ -46,7 +53,8 @@ lazy val testkit = project.in(file("testkit"))
4653
.configs(IntegrationTest)
4754
.settings(Defaults.itSettings)
4855
.dependsOn(
49-
core % "compile->compile;test->test;it->it"
56+
core % "compile->compile;test->test;it->it",
57+
local % "compile->compile;test->test;it->it"
5058
)
5159

5260
lazy val api = project.in(file("api"))

common/src/main/protobuf/message/resource.proto

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,27 @@ message ResourceCreatedEvent {
2424
required app.softnetwork.resource.model.Resource document = 1;
2525
}
2626

27-
message SessionResourceCreatedEvent {
28-
option (scalapb.message).extends = "ProtobufEvent";
29-
option (scalapb.message).extends = "SessionResourceEvent";
30-
required string uuid = 1;
31-
required string sessionId = 2;
32-
optional string uri = 3;
33-
}
34-
3527
message ResourceUpdatedEvent {
3628
option (scalapb.message).extends = "ProtobufEvent";
3729
option (scalapb.message).extends = "Updated[Resource]";
3830
option (scalapb.message).extends = "ResourceEvent";
3931
required app.softnetwork.resource.model.Resource document = 1;
4032
}
4133

42-
message SessionResourceUpdatedEvent {
34+
message ResourceDeletedEvent {
4335
option (scalapb.message).extends = "ProtobufEvent";
44-
option (scalapb.message).extends = "SessionResourceEvent";
36+
option (scalapb.message).extends = "Deleted";
37+
option (scalapb.message).extends = "ResourceEvent";
4538
required string uuid = 1;
46-
required string sessionId = 2;
47-
optional string uri = 3;
4839
}
4940

50-
message ResourceDeletedEvent {
41+
message SessionResourceUpsertedEvent {
5142
option (scalapb.message).extends = "ProtobufEvent";
52-
option (scalapb.message).extends = "Deleted";
53-
option (scalapb.message).extends = "ResourceEvent";
43+
option (scalapb.message).extends = "SessionResourceEvent";
5444
required string uuid = 1;
45+
required string sessionId = 2;
46+
required string content = 3;
47+
optional string uri = 4;
5548
}
5649

5750
message SessionResourceDeletedEvent {

common/src/main/protobuf/model/resource.proto

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ option (scalapb.options) = {
2323
* @param md5 - resource md5
2424
*/
2525
message Resource {
26+
27+
enum ProviderType {
28+
LOCAL = 0;
29+
AWS = 1;
30+
GCP = 2;
31+
AZURE = 3;
32+
MINIO = 4;
33+
DB = 5;
34+
}
35+
2636
option (scalapb.message).extends = "ProtobufDomainObject";
2737
option (scalapb.message).extends = "GenericResource";
2838
required string uuid = 1;
@@ -32,4 +42,5 @@ message Resource {
3242
required string md5 = 5;
3343
optional string mimetype = 6;
3444
optional string uri = 7;
45+
optional ProviderType providerType = 8 [default = LOCAL];
3546
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package app.softnetwork.resource
2+
3+
import app.softnetwork.protobuf.ScalaPBSerializers.GeneratedEnumSerializer
4+
import app.softnetwork.resource.model.Resource
5+
import app.softnetwork.serialization.commonFormats
6+
import org.json4s.Formats
7+
8+
package object serialization {
9+
10+
val resourceFormats: Formats = commonFormats ++
11+
Seq(
12+
GeneratedEnumSerializer(Resource.ProviderType.enumCompanion)
13+
)
14+
15+
}

common/src/main/scala/app/softnetwork/resource/spi/ResourceProvider.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package app.softnetwork.resource.spi
22

33
import app.softnetwork.utils.ImageTools.ImageSize
4+
import org.slf4j.Logger
45

56
import java.nio.file.Path
67

78
protected[resource] trait ResourceProvider {
89

10+
def log: Logger
11+
12+
def rootDir: String
13+
914
/** Upsert the underlying resource referenced by its uuid to the resource provider
1015
*
1116
* @param uuid
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package app.softnetwork.resource.spi
2+
3+
import app.softnetwork.resource.model.Resource.ProviderType
4+
5+
trait ResourceProviderSpi {
6+
7+
def providerType: ProviderType
8+
9+
def provider: ResourceProvider
10+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package app.softnetwork.resource.spi
2+
3+
import app.softnetwork.resource.model.Resource.ProviderType
4+
5+
import java.util.ServiceLoader
6+
import scala.collection.JavaConverters._
7+
8+
object ResourceProviders {
9+
10+
private[this] lazy val resourceProviderFactories: ServiceLoader[ResourceProviderSpi] =
11+
java.util.ServiceLoader.load(classOf[ResourceProviderSpi])
12+
13+
private[this] var resourceProviders: Map[String, ResourceProvider] = Map.empty
14+
15+
private[this] def registerProvider(providerType: String, provider: ResourceProvider): Unit = {
16+
resourceProviders += (providerType -> provider)
17+
}
18+
19+
def provider(providerType: ProviderType): ResourceProvider = {
20+
resourceProviders.get(providerType.name) match {
21+
case Some(provider) => provider
22+
case None =>
23+
resourceProviderFactories
24+
.iterator()
25+
.asScala
26+
.find(_.providerType == providerType)
27+
.map { factory =>
28+
val provider = factory.provider
29+
registerProvider(providerType.name, provider)
30+
provider
31+
}
32+
.getOrElse(throw new Exception(s"No provider found for type ${providerType.name}"))
33+
}
34+
}
35+
}

core/src/main/scala/app/softnetwork/resource/persistence/query/ExternalGenericResourceProvider.scala

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ package app.softnetwork.resource.persistence.query
22

33
import app.softnetwork.persistence.ManifestWrapper
44
import app.softnetwork.persistence.query.ExternalPersistenceProvider
5+
import app.softnetwork.resource.model.Resource.ProviderType
56
import app.softnetwork.resource.model.GenericResource
6-
import app.softnetwork.resource.spi.{LocalFileSystemProvider, ResourceProvider}
7+
import app.softnetwork.resource.spi.{ResourceProvider, ResourceProviders}
78

89
import scala.reflect.ClassTag
910

1011
protected[resource] trait ExternalGenericResourceProvider[Resource <: GenericResource]
1112
extends ExternalPersistenceProvider[Resource] {
12-
_: ResourceProvider with ManifestWrapper[Resource] =>
13+
_: ManifestWrapper[Resource] =>
14+
15+
def providerType: ProviderType
16+
17+
def provider: ResourceProvider = ResourceProviders.provider(providerType)
1318

1419
/** Creates the underlying document to the external system
1520
*
@@ -22,7 +27,7 @@ protected[resource] trait ExternalGenericResourceProvider[Resource <: GenericRes
2227
*/
2328
override def createDocument(document: Resource)(implicit t: ClassTag[Resource]): Boolean = {
2429
import document._
25-
upsertResource(uuid, content, uri)
30+
provider.upsertResource(uuid, content, uri)
2631
}
2732

2833
/** Updates the underlying document to the external system
@@ -41,7 +46,7 @@ protected[resource] trait ExternalGenericResourceProvider[Resource <: GenericRes
4146
t: ClassTag[Resource]
4247
): Boolean = {
4348
import document._
44-
upsertResource(uuid, content, uri)
49+
provider.upsertResource(uuid, content, uri)
4550
}
4651

4752
/** Upsert the underlying document referenced by its uuid to the external system
@@ -61,7 +66,7 @@ protected[resource] trait ExternalGenericResourceProvider[Resource <: GenericRes
6166
else
6267
None
6368
}
64-
upsertResource(segments.last, data, uri)
69+
provider.upsertResource(segments.last, data, uri)
6570
}
6671

6772
/** Deletes the underlying document referenced by its uuid to the external system
@@ -79,7 +84,7 @@ protected[resource] trait ExternalGenericResourceProvider[Resource <: GenericRes
7984
else
8085
None
8186
}
82-
deleteResource(segments.last, uri)
87+
provider.deleteResource(segments.last, uri)
8388
}
8489

8590
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package app.softnetwork.resource.persistence.query
22

33
import app.softnetwork.persistence.ManifestWrapper
4+
import app.softnetwork.resource.model.Resource.ProviderType
45
import app.softnetwork.resource.model.GenericResource
5-
import app.softnetwork.resource.spi.LocalFileSystemProvider
66

77
trait LocalFileSystemGenericResourceProvider[Resource <: GenericResource]
8-
extends ExternalGenericResourceProvider[Resource]
9-
with LocalFileSystemProvider { _: ManifestWrapper[Resource] => }
8+
extends ExternalGenericResourceProvider[Resource] { _: ManifestWrapper[Resource] =>
9+
override def providerType: ProviderType = ProviderType.LOCAL
10+
}

core/src/main/scala/app/softnetwork/resource/persistence/query/LocalFileSystemResourceProvider.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ protected[resource] trait LocalFileSystemResourceProvider
2929
uuid: String
3030
)(implicit m: Manifest[Resource], formats: Formats): Option[Resource] = {
3131
Try {
32-
val path = Paths.get(rootDir, uuid)
32+
val path = Paths.get(provider.rootDir, uuid)
3333
if (Files.exists(path)) {
3434
val fileAttributes =
3535
Files.readAttributes(path, classOf[BasicFileAttributes], LinkOption.NOFOLLOW_LINKS)
@@ -57,7 +57,7 @@ protected[resource] trait LocalFileSystemResourceProvider
5757
} match {
5858
case Success(s) => s
5959
case Failure(f) =>
60-
log.error(f.getMessage, f)
60+
provider.log.error(f.getMessage, f)
6161
None
6262
}
6363
}

0 commit comments

Comments
 (0)