2014-04-26 09:18:56 +00:00
package ICCC
2014-10-19 17:19:11 +00:00
import (
"github.com/SommerEngineering/Ocean/ICCC/Scheme"
"github.com/SommerEngineering/Ocean/Log"
LM "github.com/SommerEngineering/Ocean/Log/Meta"
"github.com/SommerEngineering/Ocean/Tools"
)
2014-04-26 09:18:56 +00:00
2015-06-17 15:44:52 +00:00
// Function to write a message to any listener.
2014-04-26 09:18:56 +00:00
func WriteMessage2Any ( channel , command string , message interface { } ) {
cacheListenerDatabaseLock . RLock ( )
defer cacheListenerDatabaseLock . RUnlock ( )
2015-06-17 15:44:52 +00:00
// Convert the message to HTTP data:
2014-04-26 09:18:56 +00:00
data := message2Data ( channel , command , message )
maxCount := cacheListenerDatabase . Len ( )
entries := make ( [ ] Scheme . Listener , 0 , maxCount )
counter := 0
2015-06-17 15:44:52 +00:00
// Loop over all listeners which are currently present at the cache:
2014-04-26 09:18:56 +00:00
for entry := cacheListenerDatabase . Front ( ) ; entry != nil ; entry = entry . Next ( ) {
listener := entry . Value . ( Scheme . Listener )
2015-06-17 15:44:52 +00:00
// If the channel and the command matches, store the listener:
2014-04-26 09:18:56 +00:00
if listener . Channel == channel && listener . Command == command {
entries = entries [ : len ( entries ) + 1 ]
entries [ counter ] = listener
}
}
count := len ( entries )
if count > 0 {
2015-06-17 15:44:52 +00:00
// Case: Find at least one possible listener. Choose a random one and deliver:
2015-06-18 15:54:29 +00:00
if len ( entries ) == 1 {
listener := entries [ 0 ]
2015-06-21 08:29:49 +00:00
go sendMessage ( listener , data )
2015-06-18 15:54:29 +00:00
} else {
listener := entries [ Tools . RandomInteger ( count ) ]
2015-06-21 08:29:49 +00:00
go sendMessage ( listener , data )
2015-06-18 15:54:29 +00:00
}
2014-04-26 09:18:56 +00:00
} else {
2015-06-17 15:44:52 +00:00
// Case: Find no listener at all.
2014-04-26 09:18:56 +00:00
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelWARN , LM . SeverityCritical , LM . ImpactUnknown , LM . MessageNameCONFIGURATION , ` It was not able to deliver this message to any listener, because no listener was found! ` , ` channel= ` + channel , ` command= ` + command )
}
}