// calculate fetches the information sequence stored under a specific // information ID. The information ID is provided by the given context. func (c *clg) calculate(ctx spec.Context) (string, error) { informationID, ok := ctx.GetInformationID() if !ok { return "", maskAnyf(invalidInformationIDError, "must not be empty") } informationSequenceKey := key.NewNetworkKey("information-id:%s:information-sequence", informationID) informationSequence, err := c.Storage().General().Get(informationSequenceKey) if err != nil { return "", maskAny(err) } return informationSequence, nil }
func (c *clg) forwardNetworkPayload(ctx spec.Context, informationSequence string) error { // Find the original information sequence using the information ID from the // context. informationID, ok := ctx.GetInformationID() if !ok { return maskAnyf(invalidInformationIDError, "must not be empty") } informationSequenceKey := key.NewNetworkKey("information-id:%s:information-sequence", informationID) informationSequence, err := c.Storage().General().Get(informationSequenceKey) if err != nil { return maskAny(err) } // Find the first behaviour ID using the CLG tree ID from the context. The // behaviour ID we are looking up here is the ID of the initial input CLG. clgTreeID, ok := ctx.GetCLGTreeID() if !ok { return maskAnyf(invalidCLGTreeIDError, "must not be empty") } firstBehaviourIDKey := key.NewNetworkKey("clg-tree-id:%s:first-behaviour-id", clgTreeID) inputBehaviourID, err := c.Storage().General().Get(firstBehaviourIDKey) if err != nil { return maskAny(err) } // Lookup the behaviour ID of the current output CLG. Below we are using this // to set the source of the new network payload accordingly. outputBehaviourID, ok := ctx.GetBehaviourID() if !ok { return maskAnyf(invalidBehaviourIDError, "must not be empty") } // Create a new contect using the given context and adapt the new context with // the information of the current scope. newCtx := ctx.Clone() newCtx.SetBehaviourID(inputBehaviourID) newCtx.SetCLGName("input") newCtx.SetCLGTreeID(clgTreeID) // We do not need to set the expectation because it never changes. // We do not need to set the session ID because it never changes. // Create a new network payload. newNetworkPayloadConfig := networkpayload.DefaultConfig() newNetworkPayloadConfig.Args = []reflect.Value{reflect.ValueOf(informationSequence)} newNetworkPayloadConfig.Context = newCtx newNetworkPayloadConfig.Destination = string(inputBehaviourID) newNetworkPayloadConfig.Sources = []string{string(outputBehaviourID)} newNetworkPayload, err := networkpayload.New(newNetworkPayloadConfig) if err != nil { return maskAny(err) } // Write the transformed network payload to the queue. networkPayloadKey := key.NewNetworkKey("events:network-payload") b, err := json.Marshal(newNetworkPayload) if err != nil { return maskAny(err) } err = c.Storage().General().PushToList(networkPayloadKey, string(b)) if err != nil { return maskAny(err) } return nil }