5.3. Tutorials (tutorial.rsl)

(****
 *
 * Module tutorial defines the objects and operations related to roadmapping 
 * and posting a tutorial in the CSTutor.
 * 
 *) 


module tutorial;

  from Page import Page, Thumbnail;
  from Data import all; 
  from Login import all;
  export all;
   
  object Tutorial is 
      components: title:Title and pages:Page* and pageNames:PageName* and roadmap:Roadmap;
      operations: AddPage, RemovePage, PostTutorialStep1, DisplayRoadmap;
      description: (*
          A tutorial is the compilation of pages. The instructor can add pages that he or 
          she has made from scratch or download them from the CSTutor online Pages Database.
          He or she can also remove these added pages. The pages are added in sequential order. 
          An instructor can post the completed tutorial to the internet.
      *);
  end Tutorial;

  object Title is string; (* The title in the title bar of the window *)

  object PageName is string; (* This PageName should = the Page.Name of the page in question *)

  object Roadmap is
      components: title:Title and thumbnails:Thumbnail* and thumbnailNames:ThumbnailName*;
      description: (*
          A roadmap is the exact graphical representation of a tutorial;
      *);
  end Roadmap;
  
  object ThumbnailName is string; (* This is the exact name of the page that the thumbnail 
                                     in question reprersents *)

  operation AddPage is
      inputs: pagesDB:PageDB, tutorial:Tutorial, page:Page;
      outputs: tutorial':Tutorial;
      description: (*
         The Instructor selects a Page from the PagesDB and then adds it to the Tutorial. 
         The Tutorial is hence updated with the new Page and output.
      *);
      precondition: (* 
                     * A page must be selected to add 
                     *)
                    page != nil;

      postcondition: (* 
                      * The page added must be added to the end of the tutorial.
                      *)
                     page = tutorial'.pages[#tutorial.pages + 1]

                     and
                    
                     (*
                      * All the pages in the original tutorial still exist in their proper 
                      * order before the just added page.
                      *)
                     (forall (i:integer | (i >= 1) and (i < #tutorial'.pages))
                         tutorial.pages[i] = tutorial'.pages[i]);
  end AddPage;

  operation RemovePage is
      inputs: tutorial:Tutorial, pages:Page*;
      outputs: tutorial':Tutorial;
      description: (*
         Instructor selects Pages in the Tutorial to remove. The tutorial is hence updated 
         without having the selected pages.
      *);
      precondition: (*
                     * A page or pages are selected to be removed and exists in the tutorial
                     *)
                    (forall (i:integer | (i >= 1) and (i <= #pages))
                        (pages[i] != nil) and (pages[i] in tutorial.pages));

      postcondition: (*
                      * The page or pages selected to be removed is no longer in the tutorial
                      *)
                     (forall (k:integer | (k >= 1) and (k < #pages))
                         (forall (i:integer | (i >= 1) and (i < #tutorial'.pages))
                             tutorial'.pages[i] != pages[k]))

                      and
                      
                      (*
                       * The number of pages is decreased by the number of pages remove
                       *)
                      #tutorial'.pages = (#tutorial.pages - #pages);
  end RemovePage;

  operation PostTutorialStep1 is
      inputs: step1Complete:Step1Complete and step1Input:Step1Input;
      outputs: step1Output:Step1Output and step1Complete':Step1Complete;
      description: (*
          PostTutorialStep1 firsts opens a Log In dialog and sends that completed info out to 
          the next step of posting.
      *);
      precondition: (*
                     * Step1 must not be completed yet.
                     *)
                     step1Complete = false;
      
      postcondition: (*
                      * step1Output must be filled with valid data
                      *)
                      step1Output.loginCookie'.userID != nil

                      and

                      step1Output.loginCookie'.isAuthenticated = true
 
                      and

                     (*
                      * Step1 must be completed.
                      *)
                     step1Complete = true;                  
  end PostTutorial;

  Step1Complete is boolean; (* Indicated what part of the wizard has been completed *)

  object Step1Input is
      components: loginCookie:LoginCookie;
      description: (*
          Retrieves information about where to post tutorials.
      *);
  end Step1Input;

  object Step1Output is
      components: loginCookie':LoginCookie;
      description: (*
          This is filled login info
      *);
  end Step1Input;

  operation PostTutorialStep2 is
      inputs: step1Complete:Step1Complete, step2Input:Step2Input;
      outputs: step2Output:Step2Output;
      description: (*
          PostTutorialStep2 takes the valid information handed back from the Log In dialog 
          and now gets the information that is needed as to what needs to be posted and for whom.
      *);
      precondition: (*
                     * Step1 must be completed.
                     *)
                     step1Complete = true

                     and
                     
                     (*
                     * There must be an active internet connection
                     *)
                     step2Input.activeInternet = true

                     and

                     (*
                     * Step2Input must be valid.
                     *)
                     step2Input.postInfo.currentD != nil

                     and
                  
                     step2Input.postInfo.tutorial != nil
                     
                     and

                     step2Input.postInfo.assignedClass != nil;
                   
      postcondition:  (*
                      * The tutorial must be posted by having it not equal the old database and 
                      * it actually being in there.
                      *)
                                                        
                      step2Output.tutorialDB != step2Input.tutorialDB

                      and

                      (exists (i:integer | (i >= 1) and (i <= #step2Output.tutorialDB))
                        (step2Output.tutorialDB[i].tutorial = step2Input.postInfo.tutorial));                          
  end PostTutorialStep2;


  object Step2Input is
      components: postInfo:PostInfo, loginInfo:LoginCookie, tutorialDB:TutorialDB, activeInternet:ActiveInternet;
      description: (*
         PostTutorial firsts gets the LoginInfo from the instructor and gets all the PostInfo to
         make the proper post to the CSTutor database.
      *);
  end Step2Input;

  object PostInfo is
      components: currentD:CurrentDirectory and tutorial:Tutorial and assignedClass:AssignedClass;
      description: (*
         The Post Info is the Tutorial the instructor selects to post along with what directory it is in. 
         Lastly the specific class it is assigned to.
      *);
  end PostInfo;

  object CurrentDirectory is string; (* The default name of the folder the user is browsing *)

  object AssignedClass is string; (* These are gathered when the user signs in and retrieves the account 
                                     information from the server. *)

  object ActiveInternet is boolean; (* Indicates wheather the internet is active or not by means of
                                       network testing *)

  object Step2Output is
      components: postSuccessful:PostSuccessfulMessage and tutorialDB:TutorialDB;
      description: (*
         The tutorial posted information.
      *);
  end Step2Output;

  object PostSuccessfulMessage is string; (* "Successful Post" message displays a message in the
                                              following format: "Thank you What ever Teacher Name was
                                              signed in, what ever tutorial selected in the "Post Info"
                                              dialog has been posted for your following class: What ever
                                              class was choosen in the "Assigned Class" combo box." *)

  operation DisplayRoadmap is
      inputs: roadmap:Roadmap, tutorial:Tutorial;
      outputs: roadmap':Roadmap;
      precondition: (*
                     * The title of the roadmap does not equal the title of the tutorial 
                     *)
                     roadmap.title != tutorial.title

                     or

                    (*
                     * The number of thumbnails in the roadmap does not equal the number of pages in the tutorial
                     *)
                     #roadmap.thumbnails != #tutorial.pages

                     or
                     
                     (*
                      * All the thumbnail names do not match the page names in order since they should be identical
                      *)
                     (exists (i:integer | (i >= 1) and (i <= #tutorial.pages))
                        (tutorial.pages[i] != nil) and (tutorial.pageNames[i] != roadmap.thumbnailNames[i]));

      postcondition: (*
                      * The title of the roadmap does equal the title of the tutorial 
                      *)
                      roadmap.title = tutorial.title

                      and

                     (*
                      * The number of thumbnails in the roadmap equals the number of pages in the tutorial
                      *)
                     #roadmap'.thumbnails = #tutorial.pages

                     and

                     (*
                      * All the thumbnail names match the page names in order since they should be identical
                      *)
		         (exists (i:integer | (i >= 1) and (i <= #tutorial.pages))
                        (tutorial.pages[i] != nil) and (tutorial.pageNames[i] = roadmap.thumbnailNames[i]));
  end DisplayRoadmap;
  
end tutorial;





Prev: pages | Next: tutorial browser | Up: spec | Top: index