This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 4245c31  plc4go: refactor spi
4245c31 is described below

commit 4245c318830c1db4da03e37d7caf3be2d84e559a
Author: Sebastian Rühl <sru...@apache.org>
AuthorDate: Fri Apr 16 18:47:11 2021 +0200

    plc4go: refactor spi
    
    + Make Builders chainable
    + deduplicate code in spi.models
    + moved RequestInterceptor.go to interceptors and resolved cyclic import 
dependency
    + refactored examples to use chained builder
---
 .../discovery/hello_world_plc4go_knx_discovery.go  |  24 ++---
 .../hello_world_plc4go_knx_read_group_address.go   |   8 +-
 .../hello_world_plc4go_knx_subscription.go         | 110 ++++++++++-----------
 plc4go/examples/read/hello_world_plc4go_read.go    |   6 +-
 plc4go/examples/write/hello_world_plc4go_write.go  |   6 +-
 plc4go/internal/plc4go/ads/Connection.go           |  13 ++-
 plc4go/internal/plc4go/knxnetip/Connection.go      |  14 +--
 plc4go/internal/plc4go/modbus/Connection.go        |  13 ++-
 .../{model => interceptors}/RequestInterceptor.go  |   2 +-
 .../interceptors/SingleItemRequestInterceptor.go   |  54 ++++++----
 .../plc4go/spi/model/DefaultBrowseRequest.go       |   3 +-
 .../plc4go/spi/model/DefaultPlcReadRequest.go      |  51 +++++-----
 .../plc4go/spi/model/DefaultPlcReadResponse.go     |  18 ++--
 .../spi/model/DefaultPlcSubscriptionEvent.go       |  24 ++---
 .../spi/model/DefaultPlcSubscriptionRequest.go     |  47 ++++-----
 .../spi/model/DefaultPlcSubscriptionResponse.go    |  12 +--
 .../plc4go/spi/model/DefaultPlcWriteRequest.go     |  32 +++---
 .../plc4go/spi/model/DefaultPlcWriteResponse.go    |  12 +--
 .../plc4go/spi/model/DefaultRequest.go}            |  33 +++----
 .../plc4go/spi/model/DefaultResponse.go}           |  29 ++----
 plc4go/pkg/plc4go/model/plc_browse.go              |   2 +-
 plc4go/pkg/plc4go/model/plc_read.go                |   4 +-
 plc4go/pkg/plc4go/model/plc_subscription.go        |  14 +--
 plc4go/pkg/plc4go/model/plc_write.go               |   4 +-
 24 files changed, 249 insertions(+), 286 deletions(-)

diff --git a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go 
b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
index e190eed..ff18277 100644
--- a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
+++ b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
@@ -51,11 +51,11 @@ func main() {
                defer connection.BlockingClose()
 
                // Try to find all KNX devices on the current network
-               browseRequestBuilder := connection.BrowseRequestBuilder()
-               //browseRequestBuilder.AddItem("allDevices", 
"[1-15].[1-15].[0-255]")
-               browseRequestBuilder.AddItem("allMyDevices", 
"[1-3].[1-6].[0-60]")
-               //browseRequestBuilder.AddItem("onlyOneDevice", "1.1.20")
-               browseRequest, err := browseRequestBuilder.Build()
+               browseRequest, err := connection.BrowseRequestBuilder().
+                       //AddItem("allDevices", "[1-15].[1-15].[0-255]").
+                       AddItem("allMyDevices", "[1-3].[1-6].[0-60]").
+                       //AddItem("onlyOneDevice", "1.1.20")
+                       Build()
                if err != nil {
                        log.Error().Err(err).Msg("error creating browse 
request")
                        return
@@ -66,9 +66,9 @@ func main() {
                        log.Info().Msgf("Inspecting detected Device at KNX 
Address: %s", knxAddress)
 
                        // Try to get all the com-objects and the group 
addresses they are attached to.
-                       browseRequestBuilder = connection.BrowseRequestBuilder()
-                       browseRequestBuilder.AddItem("comObjects", 
knxAddress+"#com-obj")
-                       browseRequest, err := browseRequestBuilder.Build()
+                       browseRequest, err := connection.BrowseRequestBuilder().
+                               AddItem("comObjects", knxAddress+"#com-obj").
+                               Build()
                        if err != nil {
                                log.Error().Err(err).Msg("error creating read 
request")
                                return false
@@ -99,10 +99,10 @@ func main() {
                                log.Info().Msgf(" - %15s (%s) %s", 
result.Field.GetAddressString(), permissions, result.Name)
                        }
 
-                       readRequestBuilder := connection.ReadRequestBuilder()
-                       
readRequestBuilder.AddQuery("applicationProgramVersion", knxAddress+"#3/13")
-                       readRequestBuilder.AddQuery("interfaceProgramVersion", 
knxAddress+"#4/13")
-                       readRequest, err := readRequestBuilder.Build()
+                       readRequest, err := connection.ReadRequestBuilder().
+                               AddQuery("applicationProgramVersion", 
knxAddress+"#3/13").
+                               AddQuery("interfaceProgramVersion", 
knxAddress+"#4/13").
+                               Build()
                        if err != nil {
                                log.Error().Msgf("Error creating read request 
for scanning %s", knxAddress)
                                return false
diff --git 
a/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go
 
b/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go
index 7ba5d76..b2be91b 100644
--- 
a/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go
+++ 
b/plc4go/examples/knx/groupAddressRead/hello_world_plc4go_knx_read_group_address.go
@@ -49,10 +49,10 @@ func main() {
        defer connection.BlockingClose()
 
        // Prepare a read-request
-       rrb := connection.ReadRequestBuilder()
-       rrb.AddQuery("firstFlorTemperatures", "2/[1,2,4,6]/10:DPT_Value_Temp")
-       rrb.AddQuery("secondFlorTemperatures", "3/[2,3,4,6]/10:DPT_Value_Temp")
-       readRequest, err := rrb.Build()
+       readRequest, err := connection.ReadRequestBuilder().
+               AddQuery("firstFlorTemperatures", 
"2/[1,2,4,6]/10:DPT_Value_Temp").
+               AddQuery("secondFlorTemperatures", 
"3/[2,3,4,6]/10:DPT_Value_Temp").
+               Build()
        if err != nil {
                fmt.Printf("error preparing read-request: %s", 
connectionResult.Err.Error())
                return
diff --git 
a/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go 
b/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go
index 0d7a795..f51e5c1 100644
--- a/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go
+++ b/plc4go/examples/knx/subscribe/hello_world_plc4go_knx_subscription.go
@@ -52,68 +52,66 @@ func main() {
        defer connection.BlockingClose()
 
        // Prepare a subscription-request
-       srb := connection.SubscriptionRequestBuilder()
-       // Intentionally catching all without datatype and the temperature 
values of the first floor with type
-       srb.AddChangeOfStateQuery("all", "*/*/*")
-       srb.AddChangeOfStateQuery("firstFlorTemperatures", 
"2/[1,2,4,6]/10:DPT_Value_Temp")
-       srb.AddItemHandler(func(event model.PlcSubscriptionEvent) {
-               // Iterate over all fields that were triggered in the current 
event.
-               for _, fieldName := range event.GetFieldNames() {
-                       if event.GetResponseCode(fieldName) == 
model.PlcResponseCode_OK {
-                               address := event.GetAddress(fieldName)
-                               value := event.GetValue(fieldName)
-                               // If the plc-value was a raw-plcValue, we will 
try lazily decode the value
-                               // In my installation all group addresses 
ending with "/10" are temperature values
-                               // and ending on "/0" are light switch actions.
-                               // So if I find a group address ending on that, 
decode it with a given type name,
-                               // If not, simply output it as array of USINT 
values.
-                               switch value.(type) {
-                               case values.RawPlcValue:
-                                       rawValue := value.(values.RawPlcValue)
-                                       datatypeName := "USINT"
-                                       if strings.HasSuffix(address, "/10") {
-                                               datatypeName = "DPT_Value_Temp"
-                                       } else if strings.HasSuffix(address, 
"/0") {
-                                               datatypeName = "BOOL"
+       if subscriptionRequest, err := connection.SubscriptionRequestBuilder().
+               // Intentionally catching all without datatype and the 
temperature values of the first floor with type
+               AddChangeOfStateQuery("all", "*/*/*").
+               AddChangeOfStateQuery("firstFlorTemperatures", 
"2/[1,2,4,6]/10:DPT_Value_Temp").
+               AddItemHandler(func(event model.PlcSubscriptionEvent) {
+                       // Iterate over all fields that were triggered in the 
current event.
+                       for _, fieldName := range event.GetFieldNames() {
+                               if event.GetResponseCode(fieldName) == 
model.PlcResponseCode_OK {
+                                       address := event.GetAddress(fieldName)
+                                       value := event.GetValue(fieldName)
+                                       // If the plc-value was a raw-plcValue, 
we will try lazily decode the value
+                                       // In my installation all group 
addresses ending with "/10" are temperature values
+                                       // and ending on "/0" are light switch 
actions.
+                                       // So if I find a group address ending 
on that, decode it with a given type name,
+                                       // If not, simply output it as array of 
USINT values.
+                                       switch value.(type) {
+                                       case values.RawPlcValue:
+                                               rawValue := 
value.(values.RawPlcValue)
+                                               datatypeName := "USINT"
+                                               if strings.HasSuffix(address, 
"/10") {
+                                                       datatypeName = 
"DPT_Value_Temp"
+                                               } else if 
strings.HasSuffix(address, "/0") {
+                                                       datatypeName = "BOOL"
+                                               }
+                                               fmt.Printf("Got raw-value event 
for address %s: ", address)
+                                               if !rawValue.RawHasMore() {
+                                                       fmt.Printf("nothing")
+                                               }
+                                               for rawValue.RawHasMore() {
+                                                       value = 
rawValue.RawDecodeValue(datatypeName)
+                                                       fmt.Printf(" '%s'", 
value.GetString())
+                                               }
+                                               fmt.Printf("\n")
+                                       default:
+                                               fmt.Printf("Got event for 
address %s: %s\n", address, value.GetString())
                                        }
-                                       fmt.Printf("Got raw-value event for 
address %s: ", address)
-                                       if !rawValue.RawHasMore() {
-                                               fmt.Printf("nothing")
-                                       }
-                                       for rawValue.RawHasMore() {
-                                               value = 
rawValue.RawDecodeValue(datatypeName)
-                                               fmt.Printf(" '%s'", 
value.GetString())
-                                       }
-                                       fmt.Printf("\n")
-                               default:
-                                       fmt.Printf("Got event for address %s: 
%s\n", address, value.GetString())
                                }
                        }
+               }).Build(); err == nil {
+               // Execute a subscription-request
+               rrc := subscriptionRequest.Execute()
+
+               // Wait for the response to finish
+               rrr := <-rrc
+               if rrr.Err != nil {
+                       fmt.Printf("error executing subscription-request: %s", 
rrr.Err.Error())
+                       return
                }
-       })
-       subscriptionRequest, err := srb.Build()
-       if err != nil {
-               fmt.Printf("error preparing subscription-request: %s", 
connectionResult.Err.Error())
-               return
-       }
 
-       // Execute a subscription-request
-       rrc := subscriptionRequest.Execute()
+               // Do something with the response
+               for _, fieldName := range rrr.Response.GetFieldNames() {
+                       if rrr.Response.GetResponseCode(fieldName) != 
model.PlcResponseCode_OK {
+                               fmt.Printf("error an non-ok return code for 
field %s: %s\n", fieldName, rrr.Response.GetResponseCode(fieldName).GetName())
+                               continue
+                       }
+               }
 
-       // Wait for the response to finish
-       rrr := <-rrc
-       if rrr.Err != nil {
-               fmt.Printf("error executing subscription-request: %s", 
rrr.Err.Error())
+               time.Sleep(time.Minute * 5)
+       } else {
+               fmt.Printf("error preparing subscription-request: %s", 
connectionResult.Err.Error())
                return
        }
-
-       // Do something with the response
-       for _, fieldName := range rrr.Response.GetFieldNames() {
-               if rrr.Response.GetResponseCode(fieldName) != 
model.PlcResponseCode_OK {
-                       fmt.Printf("error an non-ok return code for field %s: 
%s\n", fieldName, rrr.Response.GetResponseCode(fieldName).GetName())
-                       continue
-               }
-       }
-
-       time.Sleep(time.Minute * 5)
 }
diff --git a/plc4go/examples/read/hello_world_plc4go_read.go 
b/plc4go/examples/read/hello_world_plc4go_read.go
index 05d391d..11cd142 100644
--- a/plc4go/examples/read/hello_world_plc4go_read.go
+++ b/plc4go/examples/read/hello_world_plc4go_read.go
@@ -45,9 +45,9 @@ func main() {
        defer connection.BlockingClose()
 
        // Prepare a read-request
-       rrb := connection.ReadRequestBuilder()
-       rrb.AddQuery("field", "holding-register:26:REAL")
-       readRequest, err := rrb.Build()
+       readRequest, err := connection.ReadRequestBuilder().
+               AddQuery("field", "holding-register:26:REAL").
+               Build()
        if err != nil {
                fmt.Printf("error preparing read-request: %s", 
connectionResult.Err.Error())
                return
diff --git a/plc4go/examples/write/hello_world_plc4go_write.go 
b/plc4go/examples/write/hello_world_plc4go_write.go
index f549a80..22d7a0a 100644
--- a/plc4go/examples/write/hello_world_plc4go_write.go
+++ b/plc4go/examples/write/hello_world_plc4go_write.go
@@ -45,9 +45,9 @@ func main() {
        defer connection.BlockingClose()
 
        // Prepare a write-request
-       wrb := connection.WriteRequestBuilder()
-       wrb.AddQuery("field", "holding-register:26:REAL", 2.7182818284)
-       writeRequest, err := wrb.Build()
+       writeRequest, err := connection.WriteRequestBuilder().
+               AddQuery("field", "holding-register:26:REAL", 2.7182818284).
+               Build()
        if err != nil {
                fmt.Printf("error preparing read-request: %s", 
connectionResult.Err.Error())
                return
diff --git a/plc4go/internal/plc4go/ads/Connection.go 
b/plc4go/internal/plc4go/ads/Connection.go
index 5f97150..c0ddb05 100644
--- a/plc4go/internal/plc4go/ads/Connection.go
+++ b/plc4go/internal/plc4go/ads/Connection.go
@@ -33,7 +33,7 @@ import (
 type Connection struct {
        _default.DefaultConnection
        messageCodec       spi.MessageCodec
-       requestInterceptor internalModel.RequestInterceptor
+       requestInterceptor interceptors.RequestInterceptor
        configuration      Configuration
        reader             *Reader
        writer             *Writer
@@ -56,10 +56,13 @@ func NewConnection(messageCodec spi.MessageCodec, 
configuration Configuration, f
                &reader,
        )
        connection := &Connection{
-               messageCodec:       messageCodec,
-               requestInterceptor: 
interceptors.NewSingleItemRequestInterceptor(),
-               reader:             &reader,
-               writer:             &writer,
+               messageCodec: messageCodec,
+               requestInterceptor: 
interceptors.NewSingleItemRequestInterceptor(
+                       internalModel.NewDefaultPlcReadRequest,
+                       internalModel.NewDefaultPlcReadResponse,
+               ),
+               reader: &reader,
+               writer: &writer,
        }
        connection.DefaultConnection = _default.NewDefaultConnection(connection,
                _default.WithPlcFieldHandler(fieldHandler),
diff --git a/plc4go/internal/plc4go/knxnetip/Connection.go 
b/plc4go/internal/plc4go/knxnetip/Connection.go
index 052a852..14319890 100644
--- a/plc4go/internal/plc4go/knxnetip/Connection.go
+++ b/plc4go/internal/plc4go/knxnetip/Connection.go
@@ -123,8 +123,7 @@ type Connection struct {
        TunnelingRequestExpectationId int32
        DeviceConnections             
map[driverModel.KnxAddress]*KnxDeviceConnection
 
-       requestInterceptor internalModel.RequestInterceptor
-       plc4go.PlcConnection
+       requestInterceptor interceptors.RequestInterceptor
        sync.Mutex
 
        // indicates if the tunneling requests loop is running
@@ -162,10 +161,13 @@ type InternalResult struct {
 
 func NewConnection(transportInstance transports.TransportInstance, options 
map[string][]string, fieldHandler spi.PlcFieldHandler) *Connection {
        connection := &Connection{
-               options:                 options,
-               fieldHandler:            fieldHandler,
-               valueHandler:            NewValueHandler(),
-               requestInterceptor:      
interceptors.NewSingleItemRequestInterceptor(),
+               options:      options,
+               fieldHandler: fieldHandler,
+               valueHandler: NewValueHandler(),
+               requestInterceptor: 
interceptors.NewSingleItemRequestInterceptor(
+                       internalModel.NewDefaultPlcReadRequest,
+                       internalModel.NewDefaultPlcReadResponse,
+               ),
                subscribers:             []*Subscriber{},
                valueCache:              map[uint16][]int8{},
                valueCacheMutex:         sync.RWMutex{},
diff --git a/plc4go/internal/plc4go/modbus/Connection.go 
b/plc4go/internal/plc4go/modbus/Connection.go
index a52aab8..90aabec 100644
--- a/plc4go/internal/plc4go/modbus/Connection.go
+++ b/plc4go/internal/plc4go/modbus/Connection.go
@@ -38,15 +38,18 @@ type Connection struct {
        unitIdentifier     uint8
        messageCodec       spi.MessageCodec
        options            map[string][]string
-       requestInterceptor internalModel.RequestInterceptor
+       requestInterceptor interceptors.RequestInterceptor
 }
 
 func NewConnection(unitIdentifier uint8, messageCodec spi.MessageCodec, 
options map[string][]string, fieldHandler spi.PlcFieldHandler) *Connection {
        connection := &Connection{
-               unitIdentifier:     unitIdentifier,
-               messageCodec:       messageCodec,
-               options:            options,
-               requestInterceptor: 
interceptors.NewSingleItemRequestInterceptor(),
+               unitIdentifier: unitIdentifier,
+               messageCodec:   messageCodec,
+               options:        options,
+               requestInterceptor: 
interceptors.NewSingleItemRequestInterceptor(
+                       internalModel.NewDefaultPlcReadRequest,
+                       internalModel.NewDefaultPlcReadResponse,
+               ),
        }
        connection.DefaultConnection = _default.NewDefaultConnection(connection,
                _default.WithDefaultTtl(time.Second*5),
diff --git a/plc4go/internal/plc4go/spi/model/RequestInterceptor.go 
b/plc4go/internal/plc4go/spi/interceptors/RequestInterceptor.go
similarity index 98%
rename from plc4go/internal/plc4go/spi/model/RequestInterceptor.go
rename to plc4go/internal/plc4go/spi/interceptors/RequestInterceptor.go
index f865d4b..5fa730d 100644
--- a/plc4go/internal/plc4go/spi/model/RequestInterceptor.go
+++ b/plc4go/internal/plc4go/spi/interceptors/RequestInterceptor.go
@@ -17,7 +17,7 @@
 // under the License.
 //
 
-package model
+package interceptors
 
 import (
        "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
diff --git 
a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go 
b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
index 40eed70..442b88d 100644
--- a/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
+++ b/plc4go/internal/plc4go/spi/interceptors/SingleItemRequestInterceptor.go
@@ -21,50 +21,64 @@ package interceptors
 
 import (
        "errors"
-       "github.com/apache/plc4x/plc4go/internal/plc4go/spi/model"
+       "github.com/apache/plc4x/plc4go/internal/plc4go/spi"
        "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
-       apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+       "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
        "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
        "github.com/rs/zerolog/log"
 )
 
+type ReaderExposer interface {
+       GetReader() spi.PlcReader
+}
+
+type ReadRequestInterceptorExposer interface {
+       GetReadRequestInterceptor() ReadRequestInterceptor
+}
+
+type requestFactory func(fields map[string]model.PlcField, fieldNames 
[]string, reader spi.PlcReader, readRequestInterceptor ReadRequestInterceptor) 
model.PlcReadRequest
+
+type responseFactory func(request model.PlcReadRequest, responseCodes 
map[string]model.PlcResponseCode, values map[string]values.PlcValue) 
model.PlcReadResponse
+
 type SingleItemRequestInterceptor struct {
+       requestFactory  requestFactory
+       responseFactory responseFactory
 }
 
-func NewSingleItemRequestInterceptor() SingleItemRequestInterceptor {
-       return SingleItemRequestInterceptor{}
+func NewSingleItemRequestInterceptor(requestFactory requestFactory, 
responseFactory responseFactory) SingleItemRequestInterceptor {
+       return SingleItemRequestInterceptor{requestFactory, responseFactory}
 }
 
-func (m SingleItemRequestInterceptor) InterceptReadRequest(readRequest 
apiModel.PlcReadRequest) []apiModel.PlcReadRequest {
+func (m SingleItemRequestInterceptor) InterceptReadRequest(readRequest 
model.PlcReadRequest) []model.PlcReadRequest {
        // If this request just has one field, go the shortcut
        if len(readRequest.GetFieldNames()) == 1 {
                log.Debug().Msg("We got only one request, no splitting 
required")
-               return []apiModel.PlcReadRequest{readRequest}
+               return []model.PlcReadRequest{readRequest}
        }
        log.Trace().Msg("Splitting requests")
        // In all other cases, create a new read request containing only one 
item
-       defaultReadRequest := readRequest.(model.DefaultPlcReadRequest)
-       var readRequests []apiModel.PlcReadRequest
+       var readRequests []model.PlcReadRequest
        for _, fieldName := range readRequest.GetFieldNames() {
                log.Debug().Str("fieldName", fieldName).Msg("Splitting into own 
request")
                field := readRequest.GetField(fieldName)
-               subReadRequest := model.NewDefaultPlcReadRequest(
-                       map[string]apiModel.PlcField{fieldName: field},
+               subReadRequest := m.requestFactory(
+                       map[string]model.PlcField{fieldName: field},
                        []string{fieldName},
-                       defaultReadRequest.Reader,
-                       defaultReadRequest.ReadRequestInterceptor)
+                       readRequest.(ReaderExposer).GetReader(),
+                       
readRequest.(ReadRequestInterceptorExposer).GetReadRequestInterceptor(),
+               )
                readRequests = append(readRequests, subReadRequest)
        }
        return readRequests
 }
 
-func (m SingleItemRequestInterceptor) ProcessReadResponses(readRequest 
apiModel.PlcReadRequest, readResults []apiModel.PlcReadRequestResult) 
apiModel.PlcReadRequestResult {
+func (m SingleItemRequestInterceptor) ProcessReadResponses(readRequest 
model.PlcReadRequest, readResults []model.PlcReadRequestResult) 
model.PlcReadRequestResult {
        if len(readResults) == 1 {
                log.Debug().Msg("We got only one response, no merging required")
                return readResults[0]
        }
        log.Trace().Msg("Merging requests")
-       responseCodes := map[string]apiModel.PlcResponseCode{}
+       responseCodes := map[string]model.PlcResponseCode{}
        val := map[string]values.PlcValue{}
        var err error = nil
        for _, readResult := range readResults {
@@ -87,18 +101,18 @@ func (m SingleItemRequestInterceptor) 
ProcessReadResponses(readRequest apiModel.
                        }
                }
        }
-       return apiModel.PlcReadRequestResult{
+       return model.PlcReadRequestResult{
                Request:  readRequest,
-               Response: model.NewDefaultPlcReadResponse(readRequest, 
responseCodes, val),
+               Response: m.responseFactory(readRequest, responseCodes, val),
                Err:      err,
        }
 }
 
-func (m SingleItemRequestInterceptor) InterceptWriteRequest(writeRequest 
apiModel.PlcWriteRequest) []apiModel.PlcWriteRequest {
-       return []apiModel.PlcWriteRequest{writeRequest}
+func (m SingleItemRequestInterceptor) InterceptWriteRequest(writeRequest 
model.PlcWriteRequest) []model.PlcWriteRequest {
+       return []model.PlcWriteRequest{writeRequest}
 }
 
-func (m SingleItemRequestInterceptor) ProcessWriteResponses(writeRequest 
apiModel.PlcWriteRequest, writeResponses []apiModel.PlcWriteRequestResult) 
apiModel.PlcWriteRequestResult {
+func (m SingleItemRequestInterceptor) ProcessWriteResponses(writeRequest 
model.PlcWriteRequest, writeResponses []model.PlcWriteRequestResult) 
model.PlcWriteRequestResult {
        // TODO: unfinished implementation
-       return apiModel.PlcWriteRequestResult{}
+       return model.PlcWriteRequestResult{}
 }
diff --git a/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go 
b/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go
index 97468cb..9d03553 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultBrowseRequest.go
@@ -36,8 +36,9 @@ func NewDefaultPlcBrowseRequestBuilder(browser 
spi.PlcBrowser) *DefaultPlcBrowse
        }
 }
 
-func (m *DefaultPlcBrowseRequestBuilder) AddItem(name string, query string) {
+func (m *DefaultPlcBrowseRequestBuilder) AddItem(name string, query string) 
model.PlcBrowseRequestBuilder {
        m.queries[name] = query
+       return m
 }
 
 func (m *DefaultPlcBrowseRequestBuilder) Build() (model.PlcBrowseRequest, 
error) {
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go 
b/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go
index 5690bdd..b4cf699 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcReadRequest.go
@@ -22,6 +22,7 @@ package model
 import (
        "encoding/xml"
        "github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+       "github.com/apache/plc4x/plc4go/internal/plc4go/spi/interceptors"
        "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
        "github.com/pkg/errors"
        "time"
@@ -34,14 +35,14 @@ type DefaultPlcReadRequestBuilder struct {
        queryNames             []string
        fields                 map[string]model.PlcField
        fieldNames             []string
-       readRequestInterceptor ReadRequestInterceptor
+       readRequestInterceptor interceptors.ReadRequestInterceptor
 }
 
 func NewDefaultPlcReadRequestBuilder(fieldHandler spi.PlcFieldHandler, reader 
spi.PlcReader) *DefaultPlcReadRequestBuilder {
        return NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler, 
reader, nil)
 }
 
-func NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler 
spi.PlcFieldHandler, reader spi.PlcReader, readRequestInterceptor 
ReadRequestInterceptor) *DefaultPlcReadRequestBuilder {
+func NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler 
spi.PlcFieldHandler, reader spi.PlcReader, readRequestInterceptor 
interceptors.ReadRequestInterceptor) *DefaultPlcReadRequestBuilder {
        return &DefaultPlcReadRequestBuilder{
                reader:                 reader,
                fieldHandler:           fieldHandler,
@@ -53,14 +54,16 @@ func 
NewDefaultPlcReadRequestBuilderWithInterceptor(fieldHandler spi.PlcFieldHan
        }
 }
 
-func (m *DefaultPlcReadRequestBuilder) AddQuery(name string, query string) {
+func (m *DefaultPlcReadRequestBuilder) AddQuery(name string, query string) 
model.PlcReadRequestBuilder {
        m.queryNames = append(m.queryNames, name)
        m.queries[name] = query
+       return m
 }
 
-func (m *DefaultPlcReadRequestBuilder) AddField(name string, field 
model.PlcField) {
+func (m *DefaultPlcReadRequestBuilder) AddField(name string, field 
model.PlcField) model.PlcReadRequestBuilder {
        m.fieldNames = append(m.fieldNames, name)
        m.fields[name] = field
+       return m
 }
 
 func (m *DefaultPlcReadRequestBuilder) Build() (model.PlcReadRequest, error) {
@@ -72,30 +75,31 @@ func (m *DefaultPlcReadRequestBuilder) Build() 
(model.PlcReadRequest, error) {
                }
                m.AddField(name, field)
        }
-       return DefaultPlcReadRequest{
-               Fields:                 m.fields,
-               FieldNames:             m.fieldNames,
-               Reader:                 m.reader,
-               ReadRequestInterceptor: m.readRequestInterceptor,
-       }, nil
+       return NewDefaultPlcReadRequest(m.fields, m.fieldNames, m.reader, 
m.readRequestInterceptor), nil
 }
 
 type DefaultPlcReadRequest struct {
-       Fields                 map[string]model.PlcField
-       FieldNames             []string
+       DefaultRequest
        Reader                 spi.PlcReader
-       ReadRequestInterceptor ReadRequestInterceptor
+       ReadRequestInterceptor interceptors.ReadRequestInterceptor
 }
 
-func NewDefaultPlcReadRequest(fields map[string]model.PlcField, fieldNames 
[]string, reader spi.PlcReader, readRequestInterceptor ReadRequestInterceptor) 
DefaultPlcReadRequest {
+func NewDefaultPlcReadRequest(fields map[string]model.PlcField, fieldNames 
[]string, reader spi.PlcReader, readRequestInterceptor 
interceptors.ReadRequestInterceptor) model.PlcReadRequest {
        return DefaultPlcReadRequest{
-               Fields:                 fields,
-               FieldNames:             fieldNames,
+               DefaultRequest:         NewDefaultRequest(fields, fieldNames),
                Reader:                 reader,
                ReadRequestInterceptor: readRequestInterceptor,
        }
 }
 
+func (m DefaultPlcReadRequest) GetReader() spi.PlcReader {
+       return m.Reader
+}
+
+func (m DefaultPlcReadRequest) GetReadRequestInterceptor() 
interceptors.ReadRequestInterceptor {
+       return m.ReadRequestInterceptor
+}
+
 func (m DefaultPlcReadRequest) Execute() <-chan model.PlcReadRequestResult {
        // Shortcut, if no interceptor is defined
        if m.ReadRequestInterceptor == nil {
@@ -136,17 +140,6 @@ func (m DefaultPlcReadRequest) Execute() <-chan 
model.PlcReadRequestResult {
        return resultChannel
 }
 
-func (m DefaultPlcReadRequest) GetFieldNames() []string {
-       return m.FieldNames
-}
-
-func (m DefaultPlcReadRequest) GetField(name string) model.PlcField {
-       if field, ok := m.Fields[name]; ok {
-               return field
-       }
-       return nil
-}
-
 func (m DefaultPlcReadRequest) MarshalXML(e *xml.Encoder, start 
xml.StartElement) error {
        if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: 
"PlcReadRequest"}}); err != nil {
                return err
@@ -155,8 +148,8 @@ func (m DefaultPlcReadRequest) MarshalXML(e *xml.Encoder, 
start xml.StartElement
        if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: 
"fields"}}); err != nil {
                return err
        }
-       for _, fieldName := range m.FieldNames {
-               field := m.Fields[fieldName]
+       for _, fieldName := range m.fieldNames {
+               field := m.fields[fieldName]
                if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: 
fieldName}}); err != nil {
                        return err
                }
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go 
b/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go
index bd382ce..f911b3e 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcReadResponse.go
@@ -26,16 +26,16 @@ import (
 )
 
 type DefaultPlcReadResponse struct {
-       request       model.PlcReadRequest
-       responseCodes map[string]model.PlcResponseCode
-       values        map[string]values.PlcValue
+       DefaultResponse
+       request model.PlcReadRequest
+       values  map[string]values.PlcValue
 }
 
-func NewDefaultPlcReadResponse(request model.PlcReadRequest, responseCodes 
map[string]model.PlcResponseCode, values map[string]values.PlcValue) 
DefaultPlcReadResponse {
+func NewDefaultPlcReadResponse(request model.PlcReadRequest, responseCodes 
map[string]model.PlcResponseCode, values map[string]values.PlcValue) 
model.PlcReadResponse {
        return DefaultPlcReadResponse{
-               request:       request,
-               responseCodes: responseCodes,
-               values:        values,
+               DefaultResponse: NewDefaultResponse(responseCodes),
+               request:         request,
+               values:          values,
        }
 }
 
@@ -54,10 +54,6 @@ func (m DefaultPlcReadResponse) GetRequest() 
model.PlcReadRequest {
        return m.request
 }
 
-func (m DefaultPlcReadResponse) GetResponseCode(name string) 
model.PlcResponseCode {
-       return m.responseCodes[name]
-}
-
 func (m DefaultPlcReadResponse) GetValue(name string) values.PlcValue {
        return m.values[name]
 }
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go 
b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
index cf87790..4ef16b4 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
@@ -27,22 +27,22 @@ import (
 )
 
 type DefaultPlcSubscriptionEvent struct {
-       fields        map[string]model.PlcField
-       types         map[string]SubscriptionType
-       intervals     map[string]time.Duration
-       responseCodes map[string]model.PlcResponseCode
-       values        map[string]values.PlcValue
+       DefaultResponse
+       fields    map[string]model.PlcField
+       types     map[string]SubscriptionType
+       intervals map[string]time.Duration
+       values    map[string]values.PlcValue
 }
 
 func NewDefaultPlcSubscriptionEvent(fields map[string]model.PlcField, types 
map[string]SubscriptionType,
        intervals map[string]time.Duration, responseCodes 
map[string]model.PlcResponseCode,
        values map[string]values.PlcValue) DefaultPlcSubscriptionEvent {
        return DefaultPlcSubscriptionEvent{
-               fields:        fields,
-               types:         types,
-               intervals:     intervals,
-               responseCodes: responseCodes,
-               values:        values,
+               DefaultResponse: NewDefaultResponse(responseCodes),
+               fields:          fields,
+               types:           types,
+               intervals:       intervals,
+               values:          values,
        }
 }
 
@@ -66,10 +66,6 @@ func (m DefaultPlcSubscriptionEvent) GetInterval(name 
string) time.Duration {
        return m.intervals[name]
 }
 
-func (m DefaultPlcSubscriptionEvent) GetResponseCode(name string) 
model.PlcResponseCode {
-       return m.responseCodes[name]
-}
-
 func (m DefaultPlcSubscriptionEvent) GetAddress(name string) string {
        panic("GetAddress not implemented")
 }
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go 
b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
index b6fb8d3..f5b0552 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
@@ -61,46 +61,53 @@ func NewDefaultPlcSubscriptionRequestBuilder(fieldHandler 
spi.PlcFieldHandler, v
        }
 }
 
-func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicQuery(name string, 
query string, interval time.Duration) {
+func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicQuery(name string, 
query string, interval time.Duration) model.PlcSubscriptionRequestBuilder {
        m.queryNames = append(m.queryNames, name)
        m.queries[name] = query
        m.types[name] = SubscriptionCyclic
        m.intervals[name] = interval
+       return m
 }
 
-func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicField(name string, 
field model.PlcField, interval time.Duration) {
+func (m *DefaultPlcSubscriptionRequestBuilder) AddCyclicField(name string, 
field model.PlcField, interval time.Duration) 
model.PlcSubscriptionRequestBuilder {
        m.fieldNames = append(m.fieldNames, name)
        m.fields[name] = field
        m.types[name] = SubscriptionCyclic
        m.intervals[name] = interval
+       return m
 }
 
-func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateQuery(name 
string, query string) {
+func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateQuery(name 
string, query string) model.PlcSubscriptionRequestBuilder {
        m.queryNames = append(m.queryNames, name)
        m.queries[name] = query
        m.types[name] = SubscriptionChangeOfState
+       return m
 }
 
-func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateField(name 
string, field model.PlcField) {
+func (m *DefaultPlcSubscriptionRequestBuilder) AddChangeOfStateField(name 
string, field model.PlcField) model.PlcSubscriptionRequestBuilder {
        m.fieldNames = append(m.fieldNames, name)
        m.fields[name] = field
        m.types[name] = SubscriptionChangeOfState
+       return m
 }
 
-func (m *DefaultPlcSubscriptionRequestBuilder) AddEventQuery(name string, 
query string) {
+func (m *DefaultPlcSubscriptionRequestBuilder) AddEventQuery(name string, 
query string) model.PlcSubscriptionRequestBuilder {
        m.queryNames = append(m.queryNames, name)
        m.queries[name] = query
        m.types[name] = SubscriptionEvent
+       return m
 }
 
-func (m *DefaultPlcSubscriptionRequestBuilder) AddEventField(name string, 
field model.PlcField) {
+func (m *DefaultPlcSubscriptionRequestBuilder) AddEventField(name string, 
field model.PlcField) model.PlcSubscriptionRequestBuilder {
        m.fieldNames = append(m.fieldNames, name)
        m.fields[name] = field
        m.types[name] = SubscriptionEvent
+       return m
 }
 
-func (m *DefaultPlcSubscriptionRequestBuilder) AddItemHandler(eventHandler 
model.PlcSubscriptionEventHandler) {
+func (m *DefaultPlcSubscriptionRequestBuilder) AddItemHandler(eventHandler 
model.PlcSubscriptionEventHandler) model.PlcSubscriptionRequestBuilder {
        m.eventHandler = eventHandler
+       return m
 }
 
 func (m *DefaultPlcSubscriptionRequestBuilder) Build() 
(model.PlcSubscriptionRequest, error) {
@@ -113,35 +120,23 @@ func (m *DefaultPlcSubscriptionRequestBuilder) Build() 
(model.PlcSubscriptionReq
                m.fieldNames = append(m.fieldNames, name)
                m.fields[name] = field
        }
-       return DefaultPlcSubscriptionRequest{
-               fields:       m.fields,
-               fieldNames:   m.fieldNames,
-               types:        m.types,
-               intervals:    m.intervals,
-               subscriber:   m.subscriber,
-               eventHandler: m.eventHandler,
-       }, nil
+       return NewDefaultPlcSubscriptionRequest(m.fields, m.fieldNames, 
m.types, m.intervals, m.subscriber, m.eventHandler), nil
 }
 
 type DefaultPlcSubscriptionRequest struct {
-       fields       map[string]model.PlcField
-       fieldNames   []string
+       DefaultRequest
        types        map[string]SubscriptionType
        intervals    map[string]time.Duration
-       eventHandler model.PlcSubscriptionEventHandler
        subscriber   spi.PlcSubscriber
+       eventHandler model.PlcSubscriptionEventHandler
 }
 
-func (m DefaultPlcSubscriptionRequest) Execute() <-chan 
model.PlcSubscriptionRequestResult {
-       return m.subscriber.Subscribe(m)
-}
-
-func (m DefaultPlcSubscriptionRequest) GetFieldNames() []string {
-       return m.fieldNames
+func NewDefaultPlcSubscriptionRequest(fields map[string]model.PlcField, 
fieldNames []string, types map[string]SubscriptionType, intervals 
map[string]time.Duration, subscriber spi.PlcSubscriber, eventHandler 
model.PlcSubscriptionEventHandler) model.PlcSubscriptionRequest {
+       return DefaultPlcSubscriptionRequest{NewDefaultRequest(fields, 
fieldNames), types, intervals, subscriber, eventHandler}
 }
 
-func (m DefaultPlcSubscriptionRequest) GetField(name string) model.PlcField {
-       return m.fields[name]
+func (m DefaultPlcSubscriptionRequest) Execute() <-chan 
model.PlcSubscriptionRequestResult {
+       return m.subscriber.Subscribe(m)
 }
 
 func (m DefaultPlcSubscriptionRequest) GetEventHandler() 
model.PlcSubscriptionEventHandler {
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go 
b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
index 4892f3b..19a1256 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
@@ -25,14 +25,14 @@ import (
 )
 
 type DefaultPlcSubscriptionResponse struct {
-       request       model.PlcSubscriptionRequest
-       responseCodes map[string]model.PlcResponseCode
+       DefaultResponse
+       request model.PlcSubscriptionRequest
 }
 
 func NewDefaultPlcSubscriptionResponse(request model.PlcSubscriptionRequest, 
responseCodes map[string]model.PlcResponseCode) DefaultPlcSubscriptionResponse {
        return DefaultPlcSubscriptionResponse{
-               request:       request,
-               responseCodes: responseCodes,
+               DefaultResponse: NewDefaultResponse(responseCodes),
+               request:         request,
        }
 }
 
@@ -51,10 +51,6 @@ func (m DefaultPlcSubscriptionResponse) GetFieldNames() 
[]string {
        return fieldNames
 }
 
-func (m DefaultPlcSubscriptionResponse) GetResponseCode(name string) 
model.PlcResponseCode {
-       return m.responseCodes[name]
-}
-
 func (m DefaultPlcSubscriptionResponse) GetValue(name string) interface{} {
        panic("not implemented: implement me")
 }
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go 
b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go
index 94c9484..ae5eb75 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteRequest.go
@@ -52,16 +52,18 @@ func NewDefaultPlcWriteRequestBuilder(fieldHandler 
spi.PlcFieldHandler, valueHan
        }
 }
 
-func (m *DefaultPlcWriteRequestBuilder) AddQuery(name string, query string, 
value interface{}) {
+func (m *DefaultPlcWriteRequestBuilder) AddQuery(name string, query string, 
value interface{}) model.PlcWriteRequestBuilder {
        m.queryNames = append(m.queryNames, name)
        m.queries[name] = query
        m.values[name] = value
+       return m
 }
 
-func (m *DefaultPlcWriteRequestBuilder) AddField(name string, field 
model.PlcField, value interface{}) {
+func (m *DefaultPlcWriteRequestBuilder) AddField(name string, field 
model.PlcField, value interface{}) model.PlcWriteRequestBuilder {
        m.fieldNames = append(m.fieldNames, name)
        m.fields[name] = field
        m.values[name] = value
+       return m
 }
 
 func (m *DefaultPlcWriteRequestBuilder) Build() (model.PlcWriteRequest, error) 
{
@@ -84,31 +86,21 @@ func (m *DefaultPlcWriteRequestBuilder) Build() 
(model.PlcWriteRequest, error) {
                }
                plcValues[name] = value
        }
-       return DefaultPlcWriteRequest{
-               fields:     m.fields,
-               fieldNames: m.fieldNames,
-               values:     plcValues,
-               writer:     m.writer,
-       }, nil
+       return NewDefaultPlcWriteRequest(m.fields, m.fieldNames, plcValues, 
m.writer), nil
 }
 
 type DefaultPlcWriteRequest struct {
-       fields     map[string]model.PlcField
-       fieldNames []string
-       values     map[string]values.PlcValue
-       writer     spi.PlcWriter
+       DefaultRequest
+       values map[string]values.PlcValue
+       writer spi.PlcWriter
 }
 
-func (m DefaultPlcWriteRequest) Execute() <-chan model.PlcWriteRequestResult {
-       return m.writer.Write(m)
-}
-
-func (m DefaultPlcWriteRequest) GetFieldNames() []string {
-       return m.fieldNames
+func NewDefaultPlcWriteRequest(fields map[string]model.PlcField, fieldNames 
[]string, values map[string]values.PlcValue, writer spi.PlcWriter) 
model.PlcWriteRequest {
+       return DefaultPlcWriteRequest{NewDefaultRequest(fields, fieldNames), 
values, writer}
 }
 
-func (m DefaultPlcWriteRequest) GetField(name string) model.PlcField {
-       return m.fields[name]
+func (m DefaultPlcWriteRequest) Execute() <-chan model.PlcWriteRequestResult {
+       return m.writer.Write(m)
 }
 
 func (m DefaultPlcWriteRequest) GetValue(name string) values.PlcValue {
diff --git a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go 
b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go
index c2367b7..c5fe0c3 100644
--- a/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultPlcWriteResponse.go
@@ -25,14 +25,14 @@ import (
 )
 
 type DefaultPlcWriteResponse struct {
-       request       model.PlcWriteRequest
-       responseCodes map[string]model.PlcResponseCode
+       DefaultResponse
+       request model.PlcWriteRequest
 }
 
 func NewDefaultPlcWriteResponse(request model.PlcWriteRequest, responseCodes 
map[string]model.PlcResponseCode) DefaultPlcWriteResponse {
        return DefaultPlcWriteResponse{
-               request:       request,
-               responseCodes: responseCodes,
+               DefaultResponse: NewDefaultResponse(responseCodes),
+               request:         request,
        }
 }
 
@@ -51,10 +51,6 @@ func (m DefaultPlcWriteResponse) GetRequest() 
model.PlcWriteRequest {
        return m.request
 }
 
-func (m DefaultPlcWriteResponse) GetResponseCode(name string) 
model.PlcResponseCode {
-       return m.responseCodes[name]
-}
-
 func (m DefaultPlcWriteResponse) MarshalXML(e *xml.Encoder, start 
xml.StartElement) error {
        if err := e.EncodeToken(xml.StartElement{Name: xml.Name{Local: 
"PlcWriteResponse"}}); err != nil {
                return err
diff --git a/plc4go/pkg/plc4go/model/plc_read.go 
b/plc4go/internal/plc4go/spi/model/DefaultRequest.go
similarity index 56%
copy from plc4go/pkg/plc4go/model/plc_read.go
copy to plc4go/internal/plc4go/spi/model/DefaultRequest.go
index b603144..12ff0b3 100644
--- a/plc4go/pkg/plc4go/model/plc_read.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultRequest.go
@@ -19,31 +19,24 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
+import "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 
-type PlcReadRequestBuilder interface {
-       AddQuery(name string, query string)
-       AddField(name string, field PlcField)
-       Build() (PlcReadRequest, error)
+type DefaultRequest struct {
+       fields     map[string]model.PlcField
+       fieldNames []string
 }
 
-type PlcReadRequestResult struct {
-       Request  PlcReadRequest
-       Response PlcReadResponse
-       Err      error
+func NewDefaultRequest(Fields map[string]model.PlcField, FieldNames []string) 
DefaultRequest {
+       return DefaultRequest{Fields, FieldNames}
 }
 
-type PlcReadRequest interface {
-       Execute() <-chan PlcReadRequestResult
-       GetFieldNames() []string
-       GetField(name string) PlcField
-       PlcRequest
+func (m DefaultRequest) GetFieldNames() []string {
+       return m.fieldNames
 }
 
-type PlcReadResponse interface {
-       GetRequest() PlcReadRequest
-       GetFieldNames() []string
-       GetResponseCode(name string) PlcResponseCode
-       GetValue(name string) values.PlcValue
-       PlcResponse
+func (m DefaultRequest) GetField(name string) model.PlcField {
+       if field, ok := m.fields[name]; ok {
+               return field
+       }
+       return nil
 }
diff --git a/plc4go/pkg/plc4go/model/plc_read.go 
b/plc4go/internal/plc4go/spi/model/DefaultResponse.go
similarity index 56%
copy from plc4go/pkg/plc4go/model/plc_read.go
copy to plc4go/internal/plc4go/spi/model/DefaultResponse.go
index b603144..a0ae83a 100644
--- a/plc4go/pkg/plc4go/model/plc_read.go
+++ b/plc4go/internal/plc4go/spi/model/DefaultResponse.go
@@ -19,31 +19,16 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
+import "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
 
-type PlcReadRequestBuilder interface {
-       AddQuery(name string, query string)
-       AddField(name string, field PlcField)
-       Build() (PlcReadRequest, error)
+type DefaultResponse struct {
+       responseCodes map[string]model.PlcResponseCode
 }
 
-type PlcReadRequestResult struct {
-       Request  PlcReadRequest
-       Response PlcReadResponse
-       Err      error
+func (m DefaultResponse) GetResponseCode(name string) model.PlcResponseCode {
+       return m.responseCodes[name]
 }
 
-type PlcReadRequest interface {
-       Execute() <-chan PlcReadRequestResult
-       GetFieldNames() []string
-       GetField(name string) PlcField
-       PlcRequest
-}
-
-type PlcReadResponse interface {
-       GetRequest() PlcReadRequest
-       GetFieldNames() []string
-       GetResponseCode(name string) PlcResponseCode
-       GetValue(name string) values.PlcValue
-       PlcResponse
+func NewDefaultResponse(responseCodes map[string]model.PlcResponseCode) 
DefaultResponse {
+       return DefaultResponse{responseCodes}
 }
diff --git a/plc4go/pkg/plc4go/model/plc_browse.go 
b/plc4go/pkg/plc4go/model/plc_browse.go
index f51ac1c..960992d 100644
--- a/plc4go/pkg/plc4go/model/plc_browse.go
+++ b/plc4go/pkg/plc4go/model/plc_browse.go
@@ -20,7 +20,7 @@
 package model
 
 type PlcBrowseRequestBuilder interface {
-       AddItem(name string, query string)
+       AddItem(name string, query string) PlcBrowseRequestBuilder
        Build() (PlcBrowseRequest, error)
 }
 
diff --git a/plc4go/pkg/plc4go/model/plc_read.go 
b/plc4go/pkg/plc4go/model/plc_read.go
index b603144..8334d99 100644
--- a/plc4go/pkg/plc4go/model/plc_read.go
+++ b/plc4go/pkg/plc4go/model/plc_read.go
@@ -22,8 +22,8 @@ package model
 import "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 
 type PlcReadRequestBuilder interface {
-       AddQuery(name string, query string)
-       AddField(name string, field PlcField)
+       AddQuery(name string, query string) PlcReadRequestBuilder
+       AddField(name string, field PlcField) PlcReadRequestBuilder
        Build() (PlcReadRequest, error)
 }
 
diff --git a/plc4go/pkg/plc4go/model/plc_subscription.go 
b/plc4go/pkg/plc4go/model/plc_subscription.go
index d139762..0801d4b 100644
--- a/plc4go/pkg/plc4go/model/plc_subscription.go
+++ b/plc4go/pkg/plc4go/model/plc_subscription.go
@@ -36,13 +36,13 @@ type PlcSubscriptionEvent interface {
 type PlcSubscriptionEventHandler func(event PlcSubscriptionEvent)
 
 type PlcSubscriptionRequestBuilder interface {
-       AddCyclicQuery(name string, query string, interval time.Duration)
-       AddCyclicField(name string, field PlcField, interval time.Duration)
-       AddChangeOfStateQuery(name string, query string)
-       AddChangeOfStateField(name string, field PlcField)
-       AddEventQuery(name string, query string)
-       AddEventField(name string, field PlcField)
-       AddItemHandler(handler PlcSubscriptionEventHandler)
+       AddCyclicQuery(name string, query string, interval time.Duration) 
PlcSubscriptionRequestBuilder
+       AddCyclicField(name string, field PlcField, interval time.Duration) 
PlcSubscriptionRequestBuilder
+       AddChangeOfStateQuery(name string, query string) 
PlcSubscriptionRequestBuilder
+       AddChangeOfStateField(name string, field PlcField) 
PlcSubscriptionRequestBuilder
+       AddEventQuery(name string, query string) PlcSubscriptionRequestBuilder
+       AddEventField(name string, field PlcField) PlcSubscriptionRequestBuilder
+       AddItemHandler(handler PlcSubscriptionEventHandler) 
PlcSubscriptionRequestBuilder
        Build() (PlcSubscriptionRequest, error)
 }
 
diff --git a/plc4go/pkg/plc4go/model/plc_write.go 
b/plc4go/pkg/plc4go/model/plc_write.go
index c84395c..88d4f3c 100644
--- a/plc4go/pkg/plc4go/model/plc_write.go
+++ b/plc4go/pkg/plc4go/model/plc_write.go
@@ -22,8 +22,8 @@ package model
 import "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 
 type PlcWriteRequestBuilder interface {
-       AddQuery(name string, query string, value interface{})
-       AddField(name string, field PlcField, value interface{})
+       AddQuery(name string, query string, value interface{}) 
PlcWriteRequestBuilder
+       AddField(name string, field PlcField, value interface{}) 
PlcWriteRequestBuilder
        Build() (PlcWriteRequest, error)
 }
 

Reply via email to