public override void ApplyOutboundPolicy(SifMessagePayload msg, IZone zone ) {
		
		SifMessageType pload = Adk.Dtd.GetElementType(msg.ElementDef.Name);
		switch( pload ){
            case SifMessageType.SIF_Request:
			    SetRequestPolicy((SIF_Request)msg, zone );
		        break;
		}
		
	}
Example #2
0
        /// <summary>  Called by the Adk to construct a SifMessageInfo</summary>
        /// <param name="msg">The SIF_Message
        /// </param>
        /// <param name="zone">The associated zone
        /// </param>
        public SifMessageInfo(SifMessagePayload msg,
                              IZone zone)
        {
            fZone    = zone;
            fPayload = Adk.Dtd.GetElementType(msg.ElementDef.Name);
            if (zone.Properties.KeepMessageContent)
            {
                try {
                    StringWriter sw     = new StringWriter();
                    SifWriter    writer = new SifWriter(sw);
                    writer.Write(msg);
                    writer.Flush();
                    writer.Close();
                    sw.Close();

                    fMessage = sw.ToString();
                }
                catch {
                    // Do nothing
                }
            }

            //  Set SIF_Header values
            fHeader = msg.Header;
            IList <SifContext> contexts = msg.SifContexts;

            fContexts = new SifContext[contexts.Count];
            contexts.CopyTo(fContexts, 0);

            //  Set information about the message payload
            fPayloadVersion = msg.SifVersion;
            switch (fPayload)
            {
            case SifMessageType.SIF_Request:
            {
                SIF_Request req = (SIF_Request)msg;
                fObjects["SIF_MaxBufferSize"]   = req.SIF_MaxBufferSize;
                fObjects["SIF_RequestVersions"] = req.parseRequestVersions(fZone.Log);
            }
            break;

            case SifMessageType.SIF_Response:
            {
                SIF_Response rsp = (SIF_Response)msg;
                this.SIFRequestMsgId         = rsp.SIF_RequestMsgId;
                fObjects["SIF_PacketNumber"] = rsp.SIF_PacketNumber;
                SetAttribute("SIF_MorePackets", rsp.SIF_MorePackets);
            }
            break;
            }
        }
Example #3
0
        public void OnMessageProcessed(SifMessageType messageType,
                                       IMessageInfo info)
        {
            string         fileName = null;
            SifMessageInfo smi      = (SifMessageInfo)info;

            if (messageType == SifMessageType.SIF_Response)
            {
                // Log Query responses in the standard OpenADK Message tracing format
                //N-ObjectType-ZoneID-SourceID-PacketNum|”error”.txt
                fileName =
                    string.Format
                        ("{0:00000}-{1}-{2}-{3}-{4}.txt", fResponseOrdinal++,
                        smi.SIFRequestObjectType.Name, smi.Zone.ZoneId, smi.SourceId,
                        smi.PacketNumber);
            }
            else if (messageType == SifMessageType.SIF_Event)
            {
                fileName =
                    string.Format
                        ("{0:00000}-{1}-{2}-{3}-SIF_Event.txt", fResponseOrdinal++, "ChangeThis",
                        smi.Zone.ZoneId, smi.SourceId);
            }
            if (fileName != null)
            {
                try
                {
                    FileInfo file = new FileInfo(fDir + "\\Raw\\" + fileName);
                    file.Directory.Create();
                    using (
                        StreamWriter writer = new StreamWriter(file.FullName, true, Encoding.UTF8)
                        )
                    {
                        writer.Write(smi.Message);
                        writer.Close();
                    }
                }
                catch (Exception ex)
                {
                    Adk.Log.Warn(ex.Message, ex);
                }
            }
        }
Example #4
0
 public void OnMessageSent(SifMessageType messageType,
                           IMessageInfo info,
                           object receipt)
 {
 }
Example #5
0
 public bool OnSendingMessage(SifMessageType messageType,
                              IMessageInfo info,
                              StringBuilder message)
 {
     return(true);
 }
Example #6
0
 public MessagingReturnCode OnMessageReceived(SifMessageType messageType,
                                              StringBuilder message)
 {
     return(MessagingReturnCode.Process);
 }
 private void NotifyMessagingListeners_OnMessageProcessed(SifMessageType messageType,
                                                           SifMessageInfo info)
 {
     IEnumerable<IMessagingListener> msgList = GetMessagingListeners(fZone);
     foreach (IMessagingListener listener in msgList)
     {
         listener.OnMessageProcessed(messageType, info);
     }
 }
        /// <summary>  Called by the Adk to construct a SifMessageInfo</summary>
        /// <param name="msg">The SIF_Message
        /// </param>
        /// <param name="zone">The associated zone
        /// </param>
        public SifMessageInfo( SifMessagePayload msg,
                               IZone zone )
        {
            fZone = zone;
            fPayload = Adk.Dtd.GetElementType( msg.ElementDef.Name );
            if ( zone.Properties.KeepMessageContent ) {
                try {
                    StringWriter sw = new StringWriter();
                    SifWriter writer = new SifWriter( sw );
                    writer.Write( msg );
                    writer.Flush();
                    writer.Close();
                    sw.Close();

                    fMessage = sw.ToString();
                }
                catch {
                    // Do nothing
                }
            }

            //  Set SIF_Header values
            fHeader = msg.Header;
            IList<SifContext> contexts = msg.SifContexts;
            fContexts = new SifContext[ contexts.Count ];
            contexts.CopyTo( fContexts, 0 );

            //  Set information about the message payload
            fPayloadVersion = msg.SifVersion;
            switch ( fPayload ) {
                case SifMessageType.SIF_Request:
                    {
                        SIF_Request req = (SIF_Request) msg;
                        fObjects["SIF_MaxBufferSize"] = req.SIF_MaxBufferSize;
                        fObjects["SIF_RequestVersions"] = req.parseRequestVersions( fZone.Log );
                    }
                    break;

                case SifMessageType.SIF_Response:
                    {
                        SIF_Response rsp = (SIF_Response) msg;
                        this.SIFRequestMsgId = rsp.SIF_RequestMsgId;
                        fObjects["SIF_PacketNumber"] = rsp.SIF_PacketNumber;
                        SetAttribute( "SIF_MorePackets", rsp.SIF_MorePackets );
                    }
                    break;
            }
        }
Example #9
0
 public void OnMessageProcessed(SifMessageType messageType,
                                 IMessageInfo info)
 {
     string fileName = null;
     SifMessageInfo smi = (SifMessageInfo)info;
     if (messageType == SifMessageType.SIF_Response)
     {
         // Log Query responses in the standard OpenADK Message tracing format
         //N-ObjectType-ZoneID-SourceID-PacketNum|”error”.txt
         fileName =
             string.Format
                 ("{0:00000}-{1}-{2}-{3}-{4}.txt", fResponseOrdinal++,
                   smi.SIFRequestObjectType.Name, smi.Zone.ZoneId, smi.SourceId,
                   smi.PacketNumber);
     }
     else if (messageType == SifMessageType.SIF_Event)
     {
         fileName =
             string.Format
                 ("{0:00000}-{1}-{2}-{3}-SIF_Event.txt", fResponseOrdinal++, "ChangeThis",
                   smi.Zone.ZoneId, smi.SourceId);
     }
     if (fileName != null)
     {
         try
         {
             FileInfo file = new FileInfo(fDir + "\\Raw\\" + fileName);
             file.Directory.Create();
             using (
                 StreamWriter writer = new StreamWriter(file.FullName, true, Encoding.UTF8)
                 )
             {
                 writer.Write(smi.Message);
                 writer.Close();
             }
         }
         catch (Exception ex)
         {
             Adk.Log.Warn(ex.Message, ex);
         }
     }
 }
Example #10
0
 public bool OnSendingMessage(SifMessageType messageType,
                               IMessageInfo info,
                               StringBuilder message)
 {
     return true;
 }
Example #11
0
 public void OnMessageSent(SifMessageType messageType,
                            IMessageInfo info,
                            object receipt)
 {
 }
Example #12
0
 public MessagingReturnCode OnMessageReceived(SifMessageType messageType,
                                               StringBuilder message)
 {
     return MessagingReturnCode.Process;
 }
Example #13
0
        public void ProcessRequest(AdkHttpRequestContext context)
        {
            if ((Adk.Debug & AdkDebugFlags.Messaging) != 0)
            {
                Zone.Log.Debug
                    ("Received push message from " + context.Request.RemoteAddress + " (" +
                    context.Request.Url.Scheme + ")");
            }

            SIF_Ack           ack    = null;
            SifMessagePayload parsed = null;

            //Check request length and type
            if (!SifIOFormatter.IsValidContentLength(context.Request.ContentLength))
            {
                throw new AdkHttpException
                          (AdkHttpStatusCode.ClientError_400_Bad_Request,
                          "Content length Must be greater than zero");
            }

            if (!SifIOFormatter.IsValidContentMediaType(context.Request.ContentType))
            {
                throw new AdkHttpException(AdkHttpStatusCode.ClientError_415_Unsupported_Media_Type,
                                           "Content header does not support the specified media type: " + context.Request.ContentType);
            }

            //  Read raw content
            Stream        requestStream = context.Request.GetRequestStream();
            StringBuilder requestXml    = null;

            // If we need to convert the request stream to a string for either logging or messaging, do so
            if ((Adk.Debug & AdkDebugFlags.Message_Content) != 0)
            {
                requestXml = ConvertRequestToString(requestStream);
                Zone.Log.Debug
                    ("Received " + context.Request.ContentLength + " bytes:\r\n" +
                    requestXml.ToString());
            }

            TextReader requestReader = new StreamReader(requestStream, SifIOFormatter.ENCODING);

            Exception parseEx   = null;
            bool      reparse   = false;
            bool      cancelled = false;
            int       reparsed  = 0;

            do
            {
                try {
                    parseEx = null;

                    //  Parse content
                    parsed  = (SifMessagePayload)CreateParser().Parse(requestReader, Zone);
                    reparse = false;
                    parsed.LogRecv(Zone.Log);
                }
                catch (AdkParsingException adke) {
                    parseEx = adke;
                }
                catch (Exception ex) {
                    parseEx = ex;
                }

                //
                //	Notify listeners...
                //
                //	If we're asked to reparse the message, do so but do not notify
                //	listeners the second time around.
                //
                if (reparsed == 0)
                {
                    ICollection <IMessagingListener> msgList = MessageDispatcher.GetMessagingListeners(Zone);
                    if (msgList.Count > 0)
                    {
                        // Convert the stream to a string builder
                        if (requestXml == null)
                        {
                            requestXml = ConvertRequestToString(requestStream);
                        }

                        //	Determine message type before parsing
                        foreach (IMessagingListener listener in msgList)
                        {
                            try {
                                SifMessageType pload =
                                    Adk.Dtd.GetElementType(parsed.ElementDef.Name);
                                MessagingReturnCode code =
                                    listener.OnMessageReceived(pload, requestXml);
                                switch (code)
                                {
                                case MessagingReturnCode.Discard:
                                    cancelled = true;
                                    break;

                                case MessagingReturnCode.Reparse:
                                    requestReader = new StringReader(requestXml.ToString());
                                    reparse       = true;
                                    break;
                                }
                            }
                            catch (AdkException adke) {
                                parseEx = adke;
                            }
                        }
                    }
                }

                if (cancelled)
                {
                    return;
                }

                reparsed++;
            }while (reparse);

            if (parseEx != null)
            {
                //  TODO: Handle the case where SIF_OriginalSourceId and SIF_OriginalMsgId
                //  are not available because parsing failed. See SIFInfra
                //  Resolution #157.
                if (parseEx is SifException && parsed != null)
                {
                    //  Specific SIF error already provided to us by SIFParser
                    ack = parsed.AckError((SifException)parseEx);
                }
                else
                {
                    String errorMessage = null;
                    if (parseEx is AdkException)
                    {
                        errorMessage = parseEx.Message;
                    }
                    else
                    {
                        // Unchecked Throwable
                        errorMessage = "Could not parse message";
                    }

                    if (parsed == null)
                    {
                        SifException sifError = null;
                        if (parseEx is SifException)
                        {
                            sifError = (SifException)parseEx;
                        }
                        else
                        {
                            sifError = new SifException(
                                SifErrorCategoryCode.Xml,
                                SifErrorCodes.XML_GENERIC_ERROR_1,
                                "Could not parse message",
                                parseEx.ToString(),
                                this.Zone,
                                parseEx);
                        }
                        if (requestXml == null)
                        {
                            requestXml = ConvertRequestToString(requestStream);
                        }
                        ack = SIFPrimitives.ackError(
                            requestXml.ToString( ),
                            sifError,
                            this.Zone);
                    }
                    else
                    {
                        ack = parsed.AckError(
                            SifErrorCategoryCode.Generic,
                            SifErrorCodes.GENERIC_GENERIC_ERROR_1,
                            errorMessage,
                            parseEx.ToString());
                    }
                }

                if ((Adk.Debug & AdkDebugFlags.Messaging) != 0)
                {
                    Zone.Log.Warn
                        ("Failed to parse push message from zone \"" + Zone + "\": " + parseEx);
                }

                if (ack != null)
                {
                    //  Ack messages in the same version of SIF as the original message
                    if (parsed != null)
                    {
                        ack.SifVersion = parsed.SifVersion;
                    }
                    AckPush(ack, context.Response);
                }
                else
                {
                    //  If we couldn't build a SIF_Ack, returning an HTTP 500 is
                    //  probably the best we can do to let the server know that
                    //  we didn't get the message. Note this should cause the ZIS
                    //  to resend the message, which could result in a deadlock
                    //  condition. The administrator would need to manually remove
                    //  the offending message from the agent's queue.

                    if ((Adk.Debug & AdkDebugFlags.Messaging) != 0)
                    {
                        Zone.Log.Debug
                            ("Could not generate SIF_Ack for failed push message (returning HTTP/1.1 500)");
                    }
                    throw new AdkHttpException
                              (AdkHttpStatusCode.ServerError_500_Internal_Server_Error,
                              "Could not generate SIF_Ack for failed push message (returning HTTP/1.1 500)");
                }

                return;
            }

            //  Check SourceId to see if it matches this agent's SourceId
            String destId = parsed.DestinationId;

            if (destId != null && !destId.Equals(Zone.Agent.Id))
            {
                Zone.Log.Warn
                    ("Received push message for DestinationId \"" + destId +
                    "\", but agent is registered as \"" + Zone.Agent.Id + "\"");

                ack = parsed.AckError
                      (
                    SifErrorCategoryCode.Transport,
                    SifErrorCodes.WIRE_GENERIC_ERROR_1,
                    "Message not intended for this agent (SourceId of agent does not match DestinationId of message)",
                    "Message intended for \"" + destId + "\" but this agent is registered as \"" +
                    Zone.Agent.Id + "\"");

                AckPush(ack, context.Response);

                return;
            }

            //  Convert content to SIF message object and dispatch it
            ack = ProcessPush(parsed);

            //  Send SIF_Ack reply
            AckPush(ack, context.Response);
        }