20
Public Library Management System As Implemented by: James K. Muturi [email protected] (973)580-2573

Library Management System - V1.0

Embed Size (px)

DESCRIPTION

Public Library Management System

Citation preview

Page 1: Library Management System - V1.0

Public Library Management SystemAs Implemented by: James K. Muturi

[email protected](973)580-2573

Page 2: Library Management System - V1.0

Introduction:

A database has been created to support the principal functions of a lending library’s day-to-day operations: adding new members (adult and juvenile) and checking books in and out.

Project Goals: Phase 1: Windows Front-End application

Design and develop a front end application that satisfies the four basic functionalities Develop code that is easily maintainable Provide validation for all required fields Provide adequate error handling Provide a UI that is intuitive, requiring minimal training for users while minimizing

resource utilization

Phase 1: Code Samples

Validation of all required fields using Windows Event Model

private void txbJuveFName_Validating(object sender, CancelEventArgs e) { if (!BusinessLayer.Validate.FirstName(txbJuveFName.Text)) { errorProvider1.SetError(txbJuveFName, "Invalid First Name!!"); e.Cancel = true; } }

private void txbJuveFName_Validated(object sender, EventArgs e) { errorProvider1.SetError(txbJuveFName, string.Empty); }

(Validation performed according to business rules encapsulated in business layer. Focus remains on control until a valid entry is made and errors communicated to user.)

Page 3: Library Management System - V1.0

Enroll Juvenile member Implementation with exception handling

private void btnJuveEnroll_Click(object sender, EventArgs e){ try { JuvenileMember jm = new JuvenileMember { AdultMemberNum = Int16.Parse(txbJuveSponsorNum.Text), BirthDate = dtpJuveBirthDate.Value, FirstName = txbJuveFName.Text, LastName = txbJuveLName.Text, ExpirationDate = DateTime.Parse(lblAdultExprDate.Text) };

if (string.IsNullOrEmpty(txbJuveMI.Text)) { jm.MiddleInitial = null; } else { jm.MiddleInitial = txbJuveMI.Text.Trim()[0]; }

BusinessLayer bl = new BusinessLayer(); bl.AddMember(jm); lblJuveExprDate.Text = jm.ExpirationDate.Value.ToShortDateString(); lblJuveMemberNum.Text = jm.MemberNum.ToString(); } catch (LibraryException ex) { MessageBox.Show(ex.Message); } catch (Exception ex)

{ MessageBox.Show(“System Error: Exiting the system ”); this.close(); }}

(Enrolling member, displaying new member# and expiration date, handle and communicate errors ensuring a robust and user friendly system.)

Page 4: Library Management System - V1.0

Validation Implementation

public static bool FirstName(string fName){ try { string pattern = @"^[A-Z]{1}[a-z]{0,14}$"; return Regex.IsMatch(fName, pattern); } catch (ArgumentException) { return false; }}

public static bool MemberNumber(string memberNumObj){ short memberNum; if (!short.TryParse(memberNumObj, out memberNum))

{ return false; }

if (memberNum < 1) { return false; }

else { return true; }}

(Robust validation using TryParse (...) where numeric values are expected and Regular expressions where text is expected)

Page 5: Library Management System - V1.0
Page 6: Library Management System - V1.0

Phase 2: Business and Data Access Tiers

Project Goals: Phase 2: Business and Data Access Tiers

Design the Business Entity and Data Access Tiers Develop code that is easily maintainable Provide adequate error handling Use database-programming techniques that provide for maximum programming

flexibility while minimizing resource utilization.

Phase2: Code Samples Enroll Juvenile member (Data Access Layer)

public void AddMember(JuvenileMember member){ try { short? xMemberNum = 0;

LibraryEntitiesDataContext dc = new LibraryEntitiesDataContext(); dc.AddJuvenileMember( member.LastName, member.FirstName, member.MiddleInitial, member.AdultMemberNum, member.BirthDate, ref xMemberNum); member.MemberNum = (short)xMemberNum; } catch (System.Data.SqlClient.SqlException ex) { ErrorCode err = ProcessSQLException(ex); throw new LibraryException(err, ex.Message, ex); } catch (Exception ex) { throw new LibraryException(ErrorCode.None, ex.Message, ex); }}

(Juvenile member enrolled and any exceptions from the Database caught, repackaged and rethrown. Juvenile member entity updated with new member# from enrollment)

Page 7: Library Management System - V1.0

Enroll Juvenile member (SQL Stored Procedure)

ALTER PROCEDURE [dbo].[AddJuvenileMember] -- parameters for the stored procedure@lastname varchar(15),@firstname varchar(15),@middleinitial char(1),@adult_member_no smallint,@birth_date datetime,@member_no smallint output

ASBEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.SET NOCOUNT ON;begin trybegin tran

declare @currDate datetime;declare @juveCutOff datetimeset @currDate = GETDATE();set @juveCutOff = DATEADD(YYYY,-18,GETDATE());

-- check for empty or nulls in non-nullable parametersif (@lastname ='' or @lastname is null

or @firstname='' or @firstname is null or @adult_member_no < 1 or @adult_member_no is nullor @adult_member_no > 32767or @birth_date is null or @birth_date > GETDATE())

raiserror('Invalid LName,FName,Sponsor Member# or BirthDate',16,10);

-- check that the juvenile is really a juvenile i.e. < 18yrsif @juveCutOff > @birth_dateraiserror('Juvenile member over 18: ',16,9);

-- check that sponsor member exists and that membership not expiredif not exists (select * from adult where member_no=@adult_member_no and

expr_date > @currDate)raiserror('Sponsor does not exist or membership is expired. ',16,9);

-- insert into member tableinsert dbo.member (lastname,firstname,middleinitial)

values(@lastname,@firstname,@middleinitial);

--get new member numberset @member_no = SCOPE_IDENTITY();if @@ROWCOUNT <1

raiserror('Failed to add juvenile member',16,10);

-- insert into juvenile tableinsert dbo.juvenile(member_no,adult_member_no,birth_date)

values(@member_no,@adult_member_no,@birth_date)

if @@ROWCOUNT <1raiserror('Failed to add juvenile member',16,10);

commit tranend try

Page 8: Library Management System - V1.0

begin catch-- rollback transactionif @@TRANCOUNT > 0

rollback tran;

-- variables for holding exception parametersDECLARE @ErrorMessage NVARCHAR(4000);DECLARE @ErrorSeverity INT;DECLARE @ErrorState INT;

--populate varsSELECT @ErrorMessage = ERROR_MESSAGE() ,

@ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();

-- Pass error to calling program (Library DAL)RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);end catch

END

(Stored procedure implements validation checks on the juvenile member to ensure that integrity of the information in the database is maintained. Any errors are communicated back to the calling program through exceptions. If successful, returns to the calling program the new member#)

Interface (Data Access Layer)public interface IDataAccess{ void AddBook(Item item, char loanAble); void AddBookCopy(Item item); void AddMember(AdultMember member); void AddMember(JuvenileMember member); void CheckInItem(int isbn, short copyNum); void CheckOutItem(short memberID, int isbn, short copyNum); Member GetMember(int isbn, short copyNum); Member GetMember(short memberId); Item GetItem(int isbn, short copyNum); ItemsDataSet GetItems(short memberID); void RenewMember(AdultMember member); void UpgradeMember(JuvenileMember member); }

(Contract implemented by the Data Access Layer provides for flexibility and maintainability as implementation and Interface are separate)

Page 9: Library Management System - V1.0

Business Entities

MemberClass

Fields

Properties

City

ExpirationDate

FirstName

LastName

MemberNum

MemberType

MiddleInitial

PhoneNum

State

Street

ZipCode

Methods

Member

AdultMember

Member

Class

Methods

AdultMember

JuvenileMember

Member

Class

Fields

Properties

AdultMemberNum

BirthDate

Methods

JuvenileMember

ItemClass

Fields

Properties

Author

CopyNum

DueDate

ISBN

MemberNum

OutDate

Title

Methods

Item

(Use of LINQ to SQL classes to abstract data provider code allowing for flexibility and maintainability)

Page 10: Library Management System - V1.0

Phase 3: Web Application

Project Goals: Phase 3: Web Application

Design and develop a web front end application that implements the functionalities required in Phase I and Phase II.

Develop code that is easily maintainable Provide validation for all required fields Provide adequate error handling Provide a UI that is intuitive, requiring minimal training for users while minimizing

resource utilization

Phase3: Code Samples Custom Validator

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args){ DateTime xBirthDate; if (DateTime.TryParse(args.Value, out xBirthDate)) { if (JMValidate.IsJuvenile(xBirthDate)) { args.IsValid = true; } else { args.IsValid = false; errLabel.Text = "Invalid Birth Date: " + args.Value; } } else { args.IsValid = false; errLabel.Text = "Invalid Birth Date: " + args.Value; }}

(Custom validator needed as in-built ASP.NET validators insufficient)

Page 11: Library Management System - V1.0

Enroll Juvenile memberprotected void btnJuveEnroll_Click(object sender, EventArgs e){ try { //build a member object from client input. JuvenileMember member = new JuvenileMember { BirthDate = Convert.ToDateTime(txbBirthdate.Text.Trim()), AdultMemberID = Int16.Parse(txbSponsorID.Text), FirstName = txbFName.Text, LastName = txbLName.Text, ExpirationDate = Convert.ToDateTime(lblExprDateInfo.Text.Trim()) };

if (string.IsNullOrEmpty(txbMI.Text)) { member.MiddleInitial = null; } else { member.MiddleInitial = txbMI.Text.Trim()[0];}

// add a member through appropriate WCF service using (LibrarySVCClient proxy =

new LibrarySVCClient("WSHttpBinding_ILibrarySVC")) { proxy.ClientCredentials.UserName.UserName = "OtherLibrary"; proxy.ClientCredentials.UserName.Password = "Other@Library"; member = proxy.AddJuvenileMember(member); }

// update web form with new Member# and expiration date lblMemberIDInfo.Text = member.MemberID.ToString();

lblExprDateJuveInfo.Text = member.ExpirationDate.Value.ToShortDateString();

ClearMemberInfo(); } catch (FaultException<LibraryFault> ex) { errLabel2.Text = ex.Detail.Message; } catch (Exception ex) { errLabel2.Text = ex.Message; }

finally { txbFName.Focus(); } }

Page 12: Library Management System - V1.0

(Enroll juvenile screen on the Web Application showing input flow and validation)

Page 13: Library Management System - V1.0

Phase 4: WCF Service

Project Goals: Phase 4: WCF Service

Due to success of Library system, the aim is to allow interoperability with other systems thus the need for a service to further abstract the system and expose it more widely.

Create a WCF service that calls into the business layer Update the UI layer to call the service instead of the business layer Use WsHttpBinding Authenticate using ASP.Net membership where member must be in

role=”LibraryPartner”, Username=”OtherLibrary”, Password=”Other@Library”. Authorize using ASP.Net roles Provide previous project functionality.

Phase4: Code Samples Enroll Juvenile Member Implementation (WCF)

public JuvenileMember AddMember(JuvenileMember member){ try { BusinessLayer bl = new BusinessLayer(); bl.AddMember(member);

return member; } catch (LibraryException ex) { LibraryFault fault = ConvertLibraryExceptionToLbraryFault(ex); throw new FaultException<LibraryFault>(fault, fault.Message); } catch (Exception) { LibraryFault fault = new LibraryFault(); fault.LibraryErrorCode = ErrorCode.None; fault.Message = "Service Failure: Contact a system administrator"; throw new FaultException<LibraryFault>(fault, fault.Message); }

}

(Implementation of the ADD Juvenile member functionality in the service layer)

Page 14: Library Management System - V1.0

Service Contract [ServiceContract(Namespace="http://www.jm.setfocus.com")] public interface ILibrarySVC { [OperationContract(Name = "AddJuvenileMember")] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] JuvenileMember AddMember(JuvenileMember member);

[OperationContract(Name = "AddAdultMember")] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] AdultMember AddMember(AdultMember member);

( …. .. .. )

[OperationContract] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] void CheckInItem(int isbn, short copyNum);

[OperationContract] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] void CheckOutItem(short memberID, int isbn, short copyNum);

[OperationContract(Name = "GetBorrowerInfo")] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] Member GetInformation(int isbn, short copyNum);

[OperationContract(Name = "GetMemberInfo")] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] Member GetInformation(short memberId);

( .. .. … .. )

[OperationContract] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] AdultMember RenewMember(AdultMember member);

[OperationContract] [PrincipalPermission(SecurityAction.Demand, Role = "LibraryPartner")] [FaultContract(typeof(LibraryFault))] void UpgradeMember(JuvenileMember member);

}

} (Contract describing services exposed by the WCF Host)