Ignore:
Timestamp:
Oct 9, 2012, 1:58:45 PM (12 years ago)
Author:
chronos
Message:
  • Přidáno: Hlavní modul Base, který slouží jako základní rozhraní k aplikaci pro ostatní moduly. Modul System zajistí udržování seznamu instalovaných modulů v perzistentním úložišti v databázi.
  • Upraveno: Správce modulů ModuleManager je nyní použit pro každé komunikační spojení zvlášť.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Application/UWebSession.pas

    r103 r105  
    77uses
    88  Classes, SysUtils, UHTTPServer, USqlDatabase, UHTTPSessionMySQL, UUser,
    9   UHtmlClasses, UWebPage, UUtils, UXmlClasses, DateUtils;
     9  UHtmlClasses, UWebPage, UUtils, UXmlClasses, DateUtils, UModularSystem,
     10  UPageList, UWebApp, SpecializedList;
    1011
    1112type
     
    1415  TWebSession = class(THTTPHandlerData)
    1516  private
     17    procedure GeneratePageDefault(ASession: TWebSession; Page: TWebPage);
     18    procedure RegisterModules;
     19    procedure CheckModules;
    1620  public
    1721    MainModule: TObject;
    1822    Database: TSqlDatabase;
    1923    SessionStorage: THTTPSessionStorageMySQL;
    20     User: TWebUser;
    21     UserOnline: TWebOnlineUser;
    2224    HtmlDocument: THtmlDocument;
    2325    GlobalTitle: string;
    2426    TimeStart: TDateTime;
    25     procedure LoadUserInfo;
     27    BaseURL: string;
     28    ModuleManager: TModuleManager;
    2629    procedure InitDatabase;
    2730    constructor Create; override;
    2831    destructor Destroy; override;
    2932    procedure GeneratePage(Page: TWebPage);
     33    procedure Run;
    3034  end;
    31 
    32   TGeneratePageEvent = procedure (Session: TWebSession; Page: TWebPage) of object;
    3335
    3436implementation
    3537
    3638uses
    37   UCore;
     39  UCore, UModuleSystem, UModuleZdechovNET, UModuleUser, UPageAdmin, UModuleTV,
     40  UModuleFinance, UModuleNetwork, UModulePortal, UModuleIS, UModuleBase,
     41  UModuleNews;
     42
     43resourcestring
     44  SError = '<div>Error: %s</div>';
     45
    3846
    3947{ TWebSession }
     
    4250begin
    4351  inherited;
     52  ModuleManager := TModuleManager.Create(nil);
    4453  Database := TSqlDatabase.Create(nil);
    4554  SessionStorage := THTTPSessionStorageMySQL.Create(nil);
    4655  SessionStorage.Database := Database;
    4756  HtmlDocument := THtmlDocument.Create;
    48   User := TWebUser.Create;
    49   User.Database := Database;
    50   UserOnline := TWebOnlineUser.Create;
    51   UserOnline.Database := Database;
    5257end;
    5358
    5459destructor TWebSession.Destroy;
    5560begin
     61  ModuleManager.StopAll;
     62  FreeAndNil(ModuleManager);
    5663  FreeAndNil(HtmlDocument);
    57   FreeAndNil(User);
    58   FreeAndNil(UserOnline);
    5964  FreeAndNil(SessionStorage);
    6065  FreeAndNil(Database);
     
    6469procedure TWebSession.GeneratePage(Page: TWebPage);
    6570begin
    66   with TCore(MainModule) do
     71  with TModuleBase(ModuleManager.FindModuleByName('Base')) do
    6772  if Assigned(GeneratePage) then GeneratePage(Self, Page)
    6873    else GeneratePageDefault(Self, Page);
    6974end;
     75
     76procedure TWebSession.Run;
     77var
     78  FileName: string;
     79  PageName: string;
     80  Page: TRegistredPage;
     81  BaseUrlParts: TListString;
     82  ModuleBase: TModuleBase;
     83begin
     84  RegisterModules;
     85  CheckModules;
     86  ModuleManager.StartInstalled;
     87
     88      try
     89        BaseUrlParts := TListString.Create;
     90        BaseUrlParts.Explode(BaseURL, '/', StrToStr);
     91        while (BaseUrlParts.Count > 0) and (Request.Path.Count > 0) and
     92           (BaseUrlParts[0] = Request.Path[0]) do begin
     93             BaseUrlParts.Delete(0);
     94             Request.Path.Delete(0);
     95           end;
     96      finally
     97        BaseUrlParts.Free;
     98      end;
     99      if Request.Path.Count > 0 then PageName := Request.Path[0]
     100        else PageName := '';
     101      ModuleBase := TModuleBase(ModuleManager.FindModuleByName('Base'));
     102      Page := ModuleBase.Pages.FindByName(PageName);
     103      if Assigned(Page) then begin
     104        try
     105          Page.Page.OnProduce(Self);
     106        except
     107          on E: Exception do begin
     108            THTMLString(Self.HtmlDocument.Body.SubItems.AddNew(THtmlString.Create)).
     109              Text := Format(SError, [E.Message]);
     110            if Assigned(GeneratePage) then ModuleBase.GeneratePage(Self, Page.Page)
     111              else GeneratePageDefault(Self, Page.Page);
     112          end;
     113        end;
     114      end else begin
     115        Core.WebApp1.HTTPServer.FileResponse(Self)
     116      end;
     117end;
     118
     119procedure TWebSession.GeneratePageDefault(ASession: TWebSession; Page: TWebPage);
     120var
     121  I: Integer;
     122begin
     123  with ASession do begin
     124    HtmlDocument.ContentLanguage := 'cs';
     125    GlobalTitle := 'WebSystem';
     126
     127      //Page.Page.OnProduce(HandlerData);
     128      HtmlDocument.Title := Page.Caption;
     129      with HtmlDocument.AsXmlDocument do
     130      try
     131        Formated := TCore(MainModule).FormatHTML;
     132        Response.Content.WriteString(AsString);
     133      finally
     134        Free;
     135      end;
     136    end;
     137end;
     138
    70139
    71140procedure TWebSession.InitDatabase;
     
    79148end;
    80149
    81 procedure TWebSession.LoadUserInfo;
     150procedure TWebSession.RegisterModules;
    82151begin
    83   if TCore(MainModule).ModuleManager.ModuleRunning('User') then begin
    84     User.HandlerData := Self;
    85     UserOnline.HandlerData := Self;
    86     UserOnline.Update;
    87     User.Id := UserOnline.User;
    88     User.Load;
     152  with ModuleManager do begin
     153    RegisterModule(TModuleSystem.Create(nil), True);
     154    RegisterModule(TModuleBase.Create(nil), True);
     155    RegisterModule(TModuleUser.Create(nil), True);
     156    RegisterModule(TModuleZdechovNET.Create(nil), True);
     157    RegisterModule(TModuleTV.Create(nil), True);
     158    RegisterModule(TModuleFinance.Create(nil), True);
     159    RegisterModule(TModuleNetwork.Create(nil), True);
     160    RegisterModule(TModulePortal.Create(nil), True);
     161    RegisterModule(TModuleIS.Create(nil), True);
     162    RegisterModule(TModuleNews.Create(nil), True);
    89163  end;
    90164end;
    91165
     166procedure TWebSession.CheckModules;
     167var
     168  DbRows: TDbRows;
     169  Module: TModule;
     170  I: Integer;
     171begin
     172  try
     173    DbRows := TDbRows.Create;
     174    Database.Query(DbRows, 'SELECT * FROM INFORMATION_SCHEMA.TABLES ' +
     175      'WHERE TABLE_SCHEMA = "' + Database.Database + '" AND TABLE_NAME = "SystemModule"');
     176    Module := ModuleManager.FindModuleByName('System');
     177    if DbRows.Count > 0 then Module.SetInstalledState(True)
     178      else Module.SetInstalledState(False);
     179  finally
     180    DbRows.Free;
     181  end;
     182end;
     183
     184
    92185end.
    93186
Note: See TracChangeset for help on using the changeset viewer.