DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 25297 (0x62d1) Types: TextFile Names: »B«
└─⟦149519bd4⟧ Bits:30000546 8mm tape, Rational 1000, !projects 93-07-13 └─ ⟦124ff5788⟧ »DATA« └─⟦this⟧ └─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦this⟧ └─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16 └─ ⟦6f12a12be⟧ »DATA« └─⟦this⟧ └─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04 └─ ⟦d65440be7⟧ »DATA« └─⟦this⟧
------------------------------------------------------------------------------- with Umps_Defs; with Database; with Temporary; with Canvas; with Broker_Defs; with Notice; with Request; with Wild_String; with Slot; with Set; with Text_Io; package body Broker is Character_Message_Max : constant Natural := 4000; No_Error : constant Broker_Defs.Result := 0; Protocol_Error : constant Broker_Defs.Result := 1000; Already_Exist_Error : constant Broker_Defs.Result := 1001; Database_Requests_Full_Error : constant Broker_Defs.Result := 1002; Database_Notices_Full_Error : constant Broker_Defs.Result := 1003; Database_Device_Error : constant Broker_Defs.Result := 1004; Database_Internal_Error : constant Broker_Defs.Result := 1005; Cannot_Found_Behavior_Error : constant Broker_Defs.Result := 1006; Query : constant String := "Query"; End_Query : constant String := "End_Query"; Observation : constant String := "Observation"; --------------------------------------------------------------------------- procedure Put_Notice (The_Full_Notice : Canvas.Object; With_Status : Broker_Defs.Status; With_Error : Broker_Defs.Result) is Message_Sended : Boolean; A_Full_Notice : Canvas.Object := The_Full_Notice; begin Canvas.Add_Status (With_Status, A_Full_Notice); Canvas.Add_Result (With_Error, A_Full_Notice); Temporary.Put (Canvas.Image (A_Full_Notice), Message_Sended); if (not Message_Sended) then null; end if; end Put_Notice; --------------------------------------------------------------------------- procedure Put_Back_Notice (The_Full_Notice : Canvas.Object; With_Status : Broker_Defs.Status; With_Error : Broker_Defs.Result) is Message_Sended : Boolean; The_Notice : Notice.Element := Canvas.Element_Of (The_Full_Notice); A_Full_Notice : Canvas.Object := The_Full_Notice; begin Canvas.Add_Status (With_Status, A_Full_Notice); Canvas.Add_Result (With_Error, A_Full_Notice); Notice.Add_Handler (Notice.Sender (The_Notice), The_Notice); Canvas.Add_Element (The_Notice, A_Full_Notice); Temporary.Put (Canvas.Image (A_Full_Notice), Message_Sended); if (not Message_Sended) then null; end if; end Put_Back_Notice; --------------------------------------------------------------------------- procedure Put_Request (The_Full_Request : Canvas.Object; With_Status : Broker_Defs.Status; With_Error : Broker_Defs.Result) is Message_Sended : Boolean; A_Full_Request : Canvas.Object := The_Full_Request; begin Canvas.Add_Status (With_Status, A_Full_Request); Canvas.Add_Result (With_Error, A_Full_Request); Temporary.Put (Canvas.Image (A_Full_Request), Message_Sended); if (not Message_Sended) then null; end if; end Put_Request; --------------------------------------------------------------------------- procedure Put_Back_Request (The_Full_Request : Canvas.Object; With_Status : Broker_Defs.Status; With_Error : Broker_Defs.Result) is Message_Sended : Boolean; The_Request : Request.Element := Canvas.Element_Of (The_Full_Request); A_Full_Request : Canvas.Object := The_Full_Request; begin Canvas.Add_Status (With_Status, A_Full_Request); Canvas.Add_Result (With_Error, A_Full_Request); Request.Add_Handler (Request.Sender (The_Request), The_Request); Canvas.Add_Element (The_Request, A_Full_Request); Temporary.Put (Canvas.Image (A_Full_Request), Message_Sended); if (not Message_Sended) then null; end if; end Put_Back_Request; --------------------------------------------------------------------------- procedure Record_Request (The_Full_Request : Canvas.Object; The_Action : Database.Actions) is Finding_Into : Boolean := False; Iter : Database.Iter_Request; The_Request : Request.Element := Canvas.Element_Of (The_Full_Request); A_Request : Request.Element; Action : Database.Actions; State : Database.States; begin Database.Init (Iter, On => The_Request, Field => Slot.On_Value, Action => The_Action, State => Database.States'(Database.Both), Behavior => Request.Sender (The_Request)); Search_If_The_Request_Is_Already_Into: while (not Database.Done (Iter)) loop Database.Value (Iter, A_Request, Action, State); Finding_Into := True; exit Search_If_The_Request_Is_Already_Into; Database.Next (Iter); -- Never execute end loop Search_If_The_Request_Is_Already_Into; if (not Finding_Into) then Database.Put (The_Request, The_Action); Put_Back_Request (The_Full_Request, Broker_Defs.Done, No_Error); else -- Finding_Into Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Already_Exist_Error); end if; exception when Database.Too_Many_Requests_Error => Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Database_Requests_Full_Error); when Database.Device_Error => Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Database_Device_Error); when others => Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Database_Internal_Error); end Record_Request; --------------------------------------------------------------------------- procedure Register_Request (The_Full_Request : Canvas.Object) is begin if (Wild_String.Is_With_Wildcards (Request.Method (Canvas.Element_Of (The_Full_Request)))) then Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Protocol_Error); else Record_Request (The_Full_Request, Database.Performed); end if; end Register_Request; --------------------------------------------------------------------------- procedure Observe_Request (The_Full_Request : Canvas.Object) is begin Record_Request (The_Full_Request, Database.Interested); end Observe_Request; --------------------------------------------------------------------------- function Put_Into_Full_Notice (The_Request : Request.Element; With_Handler : Umps_Defs.Behavior_Number; With_Class : String) return Canvas.Object is The_Full_Notice : Canvas.Object := Canvas.Create_Notice; A_Notice : Notice.Element; begin Notice.Add_Sender (Request.Sender (The_Request), A_Notice); Notice.Add_Handler (With_Handler, A_Notice); Notice.Add_Class (With_Class, A_Notice); Notice.Add_Id (Request.Method (The_Request), A_Notice); Notice.Add_Params (Request.Params (The_Request), A_Notice); Canvas.Add_Element (A_Notice, The_Full_Notice); return The_Full_Notice; end Put_Into_Full_Notice; --------------------------------------------------------------------------- procedure Query_Request (The_Full_Request : Canvas.Object) is The_Request : Request.Element := Canvas.Element_Of (The_Full_Request); Iter : Database.Iter_Request; A_Request : Request.Element; A_Notice : Notice.Element; Action : Database.Actions; State : Database.States; The_Field : Slot.Fields := Slot.On_Value; begin Put_Back_Request (The_Full_Request, Broker_Defs.Handled, No_Error); if (Set.Is_Empty (Request.Params (The_Request))) then The_Field := Slot.On_None; end if; Database.Init (Iter, On => The_Request, Field => The_Field, Action => Database.Performed, State => Database.States'(Database.Both)); Search_All_Requests_Corresponding_To_Query: while (not Database.Done (Iter)) loop Database.Value (Iter, A_Request, Action, State); Put_Notice (Put_Into_Full_Notice (A_Request, With_Handler => Request.Sender (The_Request), With_Class => Query), Broker_Defs.Send, No_Error); Database.Next (Iter); end loop Search_All_Requests_Corresponding_To_Query; Put_Notice (Put_Into_Full_Notice (The_Request, With_Handler => Request.Sender (The_Request), With_Class => End_Query), Broker_Defs.Send, No_Error); exception when Database.Device_Error => Put_Back_Notice (Put_Into_Full_Notice (The_Request, With_Handler => Request.Sender (The_Request), With_Class => Query), Broker_Defs.Failed, Database_Device_Error); when others => Put_Back_Notice (Put_Into_Full_Notice (The_Request, With_Handler => Request.Sender (The_Request), With_Class => Query), Broker_Defs.Failed, Database_Internal_Error); end Query_Request; --------------------------------------------------------------------------- procedure Send_To_All_Interested_Behaviors (The_Full_Request : Canvas.Object) is The_Request : Request.Element := Canvas.Element_Of (The_Full_Request); A_Request : Request.Element; Iter : Database.Iter_Request; The_Sender : Umps_Defs.Behavior_Number := Request.Sender (The_Request); A_Handler : Umps_Defs.Behavior_Number; The_Handler : Umps_Defs.Behavior_Number := Request.Handler (The_Request); Action : Database.Actions; State : Database.States; begin Database.Init (Iter, On => The_Request, Field => Slot.On_Value, Action => Database.Interested); Search_All_Behaviors_Interested_By: while (not Database.Done (Iter)) loop Database.Value (Iter, A_Request, Action, State); A_Handler := Request.Sender (A_Request); if (The_Sender /= A_Handler and then The_Handler /= A_Handler) then Put_Notice (Put_Into_Full_Notice (The_Request, With_Handler => A_Handler, With_Class => Observation), Broker_Defs.Send, No_Error); end if; Database.Next (Iter); end loop Search_All_Behaviors_Interested_By; exception when others => null; -- if an error occurs then ignore them end Send_To_All_Interested_Behaviors; --------------------------------------------------------------------------- procedure Complete_Empties_Values (Source : Request.Element; Destination : in out Request.Element) is function Is_Value_Equal is new Request.Is_Equal (Field => Slot.On_Value); begin if (not Is_Value_Equal (Source, Destination)) then declare Iter_Source : Set.Iterator; Iter_Dest : Set.Iterator; Params_Source : Set.Object := Request.Params (Source); Params_Dest : Set.Object := Request.Params (Destination); New_Params : Set.Object := Set.Null_Object; Elt_Source : Slot.Element; Elt_Dest : Slot.Element; begin Set.Init (Iter_Source, Params_Source); Set.Init (Iter_Dest, Params_Dest); while (not Set.Done (Iter_Source, Params_Source)) loop Elt_Source := Set.Value (Iter_Source, Params_Source); Elt_Dest := Set.Value (Iter_Dest, Params_Dest); if (Slot.Is_Empty_Value (Elt_Dest)) then New_Params := Set.Add (Elt_Source, New_Params); else New_Params := Set.Add (Elt_Dest, New_Params); end if; Set.Next (Iter_Source, Params_Source); Set.Next (Iter_Dest, Params_Dest); end loop; Request.Add_Params (New_Params, Destination); end; end if; end Complete_Empties_Values; --------------------------------------------------------------------------- procedure Send_Request_To_Behaviors (The_Full_Request : Canvas.Object) is The_Request : Request.Element := Canvas.Element_Of (The_Full_Request); A_Request : Request.Element; Iter : Database.Iter_Request; Finding : Boolean := False; Action : Database.Actions; State : Database.States; A_Full_Request : Canvas.Object := The_Full_Request; begin Database.Init (Iter, On => The_Request, Field => Slot.On_Kind, Action => Database.Performed, State => Database.Unlock, Behavior => Request.Handler (The_Request)); Search_The_Request_Corresponding_To_Send: while (not Database.Done (Iter)) loop Database.Value (Iter, A_Request, Action, State); Request.Add_Handler (Request.Sender (A_Request), The_Request); Canvas.Add_Element (The_Request, A_Full_Request); Database.Replace (Iter, The_Element => A_Request, With_Action => Database.Performed, With_State => Database.Lock); Complete_Empties_Values (Source => A_Request, Destination => The_Request); Canvas.Add_Element (The_Request, A_Full_Request); Put_Request (A_Full_Request, Broker_Defs.Send, No_Error); Finding := True; exit Search_The_Request_Corresponding_To_Send; Database.Next (Iter); -- never execute => -- searching for only one end loop Search_The_Request_Corresponding_To_Send; if (not Finding) then Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Cannot_Found_Behavior_Error); else Send_To_All_Interested_Behaviors (A_Full_Request); end if; end Send_Request_To_Behaviors; --------------------------------------------------------------------------- procedure Send_Request (The_Full_Request : Canvas.Object) is begin if (Wild_String.Is_With_Wildcards (Request.Method (Canvas.Element_Of (The_Full_Request)))) then Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Protocol_Error); else Send_Request_To_Behaviors (The_Full_Request); end if; end Send_Request; --------------------------------------------------------------------------- procedure Relax_Behavior_And_Propage (The_Full_Request : Canvas.Object) is Iter : Database.Iter_Request; The_Request : Request.Element := Canvas.Element_Of (The_Full_Request); A_Request : Request.Element; Action : Database.Actions; State : Database.States; begin Database.Init (Iter, On => The_Request, Field => Slot.On_Kind, Action => Database.Performed, State => Database.Lock, Behavior => Request.Sender (The_Request)); Search_The_Request_Corresponding_To_End_Execution: while (not Database.Done (Iter)) loop Database.Value (Iter, A_Request, Action, State); Database.Replace (Iter, The_Element => A_Request, With_Action => Database.Performed, With_State => Database.Unlock); Put_Request (The_Full_Request, Canvas.Status_Of (The_Full_Request), Canvas.Result_Of (The_Full_Request)); exit Search_The_Request_Corresponding_To_End_Execution; Database.Next (Iter); -- never execute => -- searching for only one end loop Search_The_Request_Corresponding_To_End_Execution; end Relax_Behavior_And_Propage; --------------------------------------------------------------------------- procedure Dispatch_Request (The_Full_Request : Canvas.Object) is begin case (Canvas.Status_Of (The_Full_Request)) is when Broker_Defs.Register => Register_Request (The_Full_Request); when Broker_Defs.Observed => Observe_Request (The_Full_Request); when Broker_Defs.Query => Query_Request (The_Full_Request); when Broker_Defs.Send => Send_Request (The_Full_Request); when Broker_Defs.Failed => Relax_Behavior_And_Propage (The_Full_Request); when Broker_Defs.Handled => Relax_Behavior_And_Propage (The_Full_Request); when Broker_Defs.Done => Relax_Behavior_And_Propage (The_Full_Request); when others => Put_Back_Request (The_Full_Request, Broker_Defs.Failed, Protocol_Error); end case; end Dispatch_Request; --------------------------------------------------------------------------- procedure Observe_Notice (The_Full_Notice : Canvas.Object) is Iter : Database.Iter_Notice; The_Notice : Notice.Element := Canvas.Element_Of (The_Full_Notice); Finding_Into : Boolean := False; A_Notice : Notice.Element; begin Database.Init (Iter, On => The_Notice, Behavior => Notice.Sender (The_Notice)); Search_If_The_Notice_Is_Already_Into: while (not Database.Done (Iter)) loop Database.Value (Iter, A_Notice); Finding_Into := True; exit Search_If_The_Notice_Is_Already_Into; Database.Next (Iter); -- Never execute end loop Search_If_The_Notice_Is_Already_Into; if (not Finding_Into) then Database.Put (The_Notice); end if; exception when Database.Too_Many_Notices_Error => Put_Back_Notice (The_Full_Notice, Broker_Defs.Failed, Database_Notices_Full_Error); when Database.Device_Error => Put_Back_Notice (The_Full_Notice, Broker_Defs.Failed, Database_Device_Error); when others => Put_Back_Notice (The_Full_Notice, Broker_Defs.Failed, Database_Internal_Error); end Observe_Notice; --------------------------------------------------------------------------- procedure Send_Notice_To_The_Behaviors (The_Full_Notice : Canvas.Object) is Behavior_Interested : Umps_Defs.Behavior_Number; The_Notice : Notice.Element := Canvas.Element_Of (The_Full_Notice); The_Sender : Umps_Defs.Behavior_Number := Notice.Sender (The_Notice); The_Handler : Umps_Defs.Behavior_Number := Notice.Handler (The_Notice); Iter : Database.Iter_Notice; A_Notice : Notice.Element; A_Full_Notice : Canvas.Object := The_Full_Notice; begin Database.Init (Iter, On => The_Notice); Search_All_Behaviors_Interested_By_The_Notice: while (not Database.Done (Iter)) loop Database.Value (Iter, A_Notice); Behavior_Interested := Notice.Sender (A_Notice); if (Behavior_Interested /= The_Sender and then Behavior_Interested /= The_Handler) then Notice.Add_Sender (The_Sender, The_Notice); Notice.Add_Handler (Behavior_Interested, The_Notice); Canvas.Add_Element (The_Notice, A_Full_Notice); Put_Notice (A_Full_Notice, Broker_Defs.Send, No_Error); end if; Database.Next (Iter); end loop Search_All_Behaviors_Interested_By_The_Notice; if (The_Handler /= Umps_Defs.Any_Behaviors) then Notice.Add_Sender (The_Sender, The_Notice); Notice.Add_Handler (The_Handler, The_Notice); Canvas.Add_Element (The_Notice, A_Full_Notice); Put_Notice (A_Full_Notice, Broker_Defs.Send, No_Error); end if; exception when Database.Device_Error => Put_Back_Notice (The_Full_Notice, Broker_Defs.Send, Database_Device_Error); when others => Put_Back_Notice (The_Full_Notice, Broker_Defs.Send, Database_Internal_Error); end Send_Notice_To_The_Behaviors; --------------------------------------------------------------------------- procedure Send_Notice (The_Full_Notice : Canvas.Object) is The_Notice : Notice.Element := Canvas.Element_Of (The_Full_Notice); begin if (Wild_String.Is_With_Wildcards (Notice.Class (The_Notice)) or else Wild_String.Is_With_Wildcards (Notice.Id (The_Notice))) then Put_Back_Notice (The_Full_Notice, Broker_Defs.Failed, Protocol_Error); else Send_Notice_To_The_Behaviors (The_Full_Notice); end if; end Send_Notice; --------------------------------------------------------------------------- procedure Dispatch_Notice (The_Full_Notice : Canvas.Object) is begin case (Canvas.Status_Of (The_Full_Notice)) is when Broker_Defs.Observed => Observe_Notice (The_Full_Notice); when Broker_Defs.Send => Send_Notice (The_Full_Notice); when others => Put_Back_Notice (The_Full_Notice, Broker_Defs.Failed, Protocol_Error); end case; end Dispatch_Notice; --------------------------------------------------------------------------- procedure Dispatch_Message (The_Message : Canvas.Object) is use Broker_Defs; begin if (Canvas.Class_Of (The_Message) = Broker_Defs.Request) then Dispatch_Request (The_Message); else Dispatch_Notice (The_Message); end if; end Dispatch_Message; --------------------------------------------------------------------------- procedure Start is A_Message : String (1 .. Character_Message_Max); Message_Size : Natural; Message_Receive : Boolean; The_Message : Canvas.Object; begin Database.Open; Temporary.Init; Forever: loop Temporary.Get (A_Message, Message_Size, Message_Receive); if (Message_Receive) then The_Message := Canvas.Value (A_Message (A_Message'First .. Message_Size)); Text_Io.Put_Line ("--> Message recu : " & Canvas.Image (The_Message)); Dispatch_Message (The_Message); end if; end loop Forever; exception when Database.Internal_Error => Text_Io.Put_Line ("*** Verify your access rigths"); raise; when others => raise; end Start; end Broker; -------------------------------------------------------------------------------