Major Assignment Semester 1, 2018
The learning objectives for this major assignment are:
K1. Explain the principles of inheritance, composition and their consequences
K2. Discuss basic object-oriented concepts
K3. Explain the principles of event-driven programming
S1. develop object-oriented programs involving several interacting classes
S2. incorporate pre-written classes, including those from the SDK, into software solutions
S3. develop object-oriented programs which involve both object-oriented and event-driven aspects
A1. design, develop, test and debug programs from supplied program specifications
By completing this assignment, you will develop your understanding of and apply object-oriented programming techniques, in particular, those relating to inheritance and polymorphism. You will develop skills and experience in the use of the Java Collections API classes and I/O classes. You will demonstrate your ability to successfully design and develop a working event-driven system.
You will develop a multi-class program to meet functional specifications applying design principles and making use of the ArrayList and Map abstract data types.
You are encouraged to partner with another student and engage in paired programming to complete this assignment.
This major assignment will be submitted in 3 stages. Each stage will build on the previous stage. You will also be asked to demonstrate or describe your code to highlight particular concepts you have implemented. This demonstration/reflection will be individually assessed.
This assignment requires you to complete various tasks involving classes you write with your partner. You may also use classes that you find in the Java SDK.
The system that you will create is a Farmer’s Market Management System (FMMS). The FMMS is a tool used by Dogwood Council to manage multiple Farmer’s Markets in their area. A Farmer’s Market may be located at different sites, for different purposes (e.g. open-air market or indoor market, charity market, community fundraising market, food swap market etc.) and different opening times.
Each Market has a name and is associated with a particular address and session time. Each Market is also made up of stalls selling items. This IT system, FMMS, will enable the Council-manager to manage information about the farmers market as well as the stalls.
It will be possible to inspect details for each stall separately. The details will include specifics of the stall as well as specific details regarding discounts that may apply to certain items (e.g. All green apples might be half price). Stalls will be saved separately as specific individual stalls (e.g. apple stall, potato stall, berry stall, onion stall). It will also be possible to categorise particular items at each stall. The item classification will determine the way the prices are calculated for display on the stall. Each item will have a basic price associated with it. When the price for display in the stall in calculated, this calculation may involve increasing the price with surcharges (e.g. some items might have a surcharge due to the difficulty in sourcing the item locally); or decreasing the price due to a special discount.
You will create a GUI using the java.swing library package.
You will need to zip your project up when you are finished each stage and submit it as a single zip file to Moodle by the due date. You will also need to submit a report. The report will require some written and diagrammatic information describing your system. Please write clearly and IN YOUR OWN WORDS (plagiarism is NOT acceptable – refer to Course Description).
It is expected that each student pair will creatively design and author a unique system based on individual design choices that fit with the requirements listed in each task. Before you begin, read over the entire assignment and understand all the tasks. Acknowledge authors for all code that you submit using in code comments.
All code must conform to stylistic standards including proper commenting, appropriate choice of identifier names (including case), proper indenting and other readability issues. Otherwise, marks will be deducted. Consult http://www.oracle.com/technetwork/java/codeconventions-150003.pdf
Stage One is due in week 7. Stage Two is due in week 9. Stage Three is due in week 11. In weeks 10 and 12, you will be interviewed by your tutor in your lab class. You will be asked questions about your code.
Stage 1a Designing and Documenting your system Due date: Week 7
Create a document named: surnameStudentIDAssign1.doc . In your document, you must include the following section headings:
b) System Overview,
c) Class Diagram,
In the System Overview section, you are to write 100-200 words describing your system and how it could be used in an imaginary scenario. You will need to review this after completing all tasks and ensure that your overview explains your entire system. State any assumptions you are making in your system. It is expected that you will create a system that can accommodate managing some stalls. For each stall, there should be an associated stall name and some items each associated with a unique item number in the stall on which it appears. You may add further attributes such as description if you wish.
The final price for an item may be different from the price entered into the system. The final price should be based on the type of item. There should be some possible types of items incorporated into your system. Example item types are as follows:
a) A standard item will have the price calculated based exactly on the price entered into the system
b) A premium item can be created with a mechanism to indicate that it is to have a surcharge added to the price.
c) It is possible to create a discounted item where a discount has been applied to a given price
The FMMS system will have at least four different item types (e.g. standard, premium or discounted). You may choose a name for each type and what the distinguishing features of each type are. It is suggested (at a minimum) that each item type will have a different process for calculating the published price.
Each stall created is expected to have at least ten associated items. The total number of stalls is limited to a maximum of 30, and your system should allow for multiple pages of stalls. Your system will be able to add items to the stall after it has been created. The stall details will include a name as well as details naming a data file that will be used to preload the items. A StallItem is a generalised class representing a generic item. Each actual item created will be instantiated as one of the specialised types of item that inherits from StallItem
In this section, you are to provide a class diagram for every user-authored class you anticipate in your first version of the system. The first version will include a text-based driven system with classes that will be used to create objects to represent three different stalls, as well as different items that belong to each stall. You are expected to use inheritance so that you have an abstract item class and specialisation classes for different types of items.
As you develop your classes and methods, you will write testing code to verify that your code is working correctly. In this section, you will describe your initial chosen test data and explain how that data will help you test your code. Make sure that you choose a variety of test cases to ensure you can be satisfied that your code is working. Describe your test cases and include screenshots of your testing results (so far) in this section.
Stage 1b - Task 2 Creating classes for stalls and items using associations and inheritance. Due date: Week 7
Create a new project in Eclipse called Assignment 1.
Within this project create a package called FarmersMarketManagementSystem.
Author six classes within your newly created package: General classes to create first are Stall, StallItem and your FarmersMarketDriver class. In addition to these, you are to create at least FOUR classes representing possible types of items that are specialisations on the general abstract class: StallItem. All StallItems have (at least) the following attributes: itemName (String) and itemPrice(double). When designing your specialisation classes, you have to choose additional attributes particular to each specific item type. Each item type will have a different getPrice() method that will override the getPrice() method in the abstract class StallItem and calculate the price to display based on the rules for each type.
You must provide at least two constructors for each particular specialised item type class:
a) A default constructor which assigns each instance variable a default value.
b) A constructor with parameters which assign values to each instance variable.
Create a seventh class, StallItemDatabase that you will use to manage a group of stall items. This class will be associated with the Stall class. The stall will have an attribute that is referencing an object based on this class. The StallItemDatabase class will contain an ArrayList of StallItem as well as an appropriate method named insert that could be used to add a particular StallItem into to the list of StallItems. The insert method should take two parameters: an integer value representing the stall item number (corresponding to the number on the stall) and a stall item object. Also, author a method named retrieve that will get the stall item in a given index position from the ArrayList. You can assume initially that the index position corresponds to the item number on the stall.
Author get and set methods for your classes for instance variables where appropriate.
Write a toString() method in each class that will return a String containing all the relevant data for each of your objects.
In each of your specialised stall item classes, create the getPrice method to perform an appropriate price calculation based on the data in the object.
Create a FarmersMarketDriver test class. In this class, provide a main method containing code to implement your test plan to test all constructors and methods including your toString () method, for each class you have written. Run your tests and make sure your class is behaving correctly.
Write further code in your test class so that you can create a stall for a farmer’s market and add items to that stall. This should be stall driven so that you can manually input some data. You may also like to hardcode some test cases.
In your documentation, outline your test plan (For example, outline what objects you created to demonstrate that your classes written so far are working correctly).
Explain how you have tested your code and the results of your testing. Include screenshots in your documentation demonstrating the output when you tested your code.
Document all methods in your code using comments. You may be creative with the individual class attributes you associate with your objects and methods you create. If you have any difficulty with ideas, discuss this with your tutor.
After submission of stage 1, your tutor will give you feedback to help you progress to stage 2 and stage 3.
Stage 2 - Convert your Item class to become an abstract class, populating your stall items from an input file, producing output to a report text file, creating an enclosure occupant list, using abstract data types (Map). Due Week 9
Create an input file AppleStall.txt containing at least ten different stall items (ensure you have at least one of each different item – standard/discount/premium). The data will include the name of the stall and then some items. The type of each item should be identified.
Your file may look something like this: (it doesn’t have to look exactly like this – the format is up to you). In this example, for the venue: “Apple Stall”, there are four stall item types: Premium, Standard, Discount and Special.
In your submission report describe the actual format of data in your data.txt file. Name the fields of data that will be in the file and the order in which they will be found. (e.g. Market or Stall name will be first and will be a string on one line, then some stall items will follow ….etc.)
Modify your StallItem class so that it is an abstract class. Change your getPrice and setPrice methods to be abstract methods in StallItem so that they must be overridden and provided in each inherited special stall item class.
Write a method on your stall class to read the stall and stall items information from the file, and create a new farmers market stall. This includes populating the stall with stall items based on data from the file. You will need to create the correct stall item type based on information in the file.
Write a toString() method that will generate an output string detailing the stall. Use polymorphism where possible.
Extend your system so that it will allow a customer to view what a stall is selling and then allow the customer to purchase items. The order can contain 1 or more stall items that have been selected. If the order is a home delivery, you need to add a further delivery charge to the order.
Add further code to your driver class and write a test method which tests your system using a text- based system. Test using a scenario involving displaying the contents of a stall and asking the customer purchase items. In your report document, describe the testing scenario and the expected behaviour of your system. Provide screenshots of your system testing in your final report. Write a method to appropriately populate your stall with details read from a file. Ensure you have comments to describe each of your new classes in your code.
Add a method to output a stall saved to a file. This output report must save details of a particular stall, including the stall items and their base price (which may be different from the displayed price).
Test your classes to check they are working correctly. Document your testing process – describe your test data and the outcome of your testing. Include screenshots in your report document illustrating your testing process and the outcome of your testing.
Change your stall item class that manages a collection of stall items. In this class, you will replace the ArrayList with a Map data type. You can assume each Stall Item number is unique. The map data type enables you to look up and easily retrieve details for a stall item given its item number. Use the item number as the key.
Further test your system to ensure it is working, document your testing process.
Update your UML class diagram so that it is consistent with your code. You may use Enterprise Architect to import your code and generate the class diagram. Another option is to install ObjectAid UML Explorer directly into Eclipse (Check out http://www.objectaid.com for more information).
After you have submitted stage 2, a partial code solution will be provided for viewing at the discretion of your tutor at individual consultation appointments.
Stage 3 creating a patron GUI Interface Due Week 11
In this stage, you will create a GUI interface for your system. This will replace your text-based FarmersMarketDriver created in stage 2. The GUI interface may be used on a touchscreen for visiting customers. There is example code on Moodle that demonstrates how to create a GUI. You are strongly encouraged to refer to those examples.
Draw a schematic sketch of your GUI design. On your diagram, highlight where you intend each panel to be and the contents of each panel (e.g. buttons, lists, radio buttons, labels). Where you have content to be displayed based on an object in your code, note this on your diagram. Also, indicate the events you expect your GUI to respond to and what happens following each event. For example, “when the button < X> is pressed, this event will trigger a call to method <Y> which will perform a calculation using the values in the selected list and display the result in the text field in the centre panel. “
Design and coding of the GUI using the swing library
Create a new class that will manage your GUI System. This class will take one parameter when constructed, a reference to a Stall object. So, if you invoke your GUISystem class twice (with two different stalls), you will create two separate windows – one for each stall.
You will have the initial startup GUI window where you provide a list of stalls available to view. You must be able to select a stall to display and then when you click on the button to open that stall(s), each stall will appear in a new separate window. It is expected that no submissions will be identical, so ensure that your GUI has some unique elements to it. Be creative! It is expected that each student pair will creatively design and author a unique system based on individual choices that fit the requirements.
You must satisfy the following requirements for full marks on this task:
Display in a startup GUI window the list of Stalls available to visit, select one or more (using a checklist) to then view or edit. For each stall selected, create a new GUI window for that stall.
Create and use at least two buttons on the startup GUI, to open a stall and to exit the system
Include a button that ‘does’ something based on the stall (e.g. calculate and display the total price
for a customer)
Use checkboxes to allow a user to select the stall items to create a customer purchase. These should be populated by a vector list and should be consistent with the stall items that are stored in that stall.
Display in a scrollable output text box the purchase details based on user selection. The purchase details do not need to be saved as this system will not keep records of each customer purchases.
Also, your code must be well designed into methods applying the principles of coupling and cohesion. You must deal with exceptions appropriately.
Note: your GUI does not need to create /edit or save your stalls. Those administrative functions from stage 2 could be done using the text-based program you wrote.
Allocated Marks: See Course Description
You will be marked on the design and quality of your code, your documentation and also your ability to individually answer questions based on this code in an interview.
Due Date: See Course Description
Please refer to the Course Description for information relating to late assignments and special consideration.
Plagiarism: Please refer to the Course Description for information regarding Plagiarism.
Assignments must be submitted by the due date, and your assignment should be completed according to the General Guidelines for Presentation of Academic Work
(http://www.ballarat.edu.au/aasp/student/learning_support/generalguide/) and programming standards (http://www.oracle.com/technetwork/java/codeconventions-150003.pdf).
The following criteria will be used when marking of your assignment:
successful completion of the required tasks
ability to answer questions about your code and concepts demonstrated in your code
adherence to the guidelines provided
quality of code that adheres to the programming standards for the Course including:
comments and documentation
meaningful variable names
You are required to provide the following documentation:
a statement of what has been completed and acknowledgement of the names of all people (including other students and people outside of the university) who have assisted you and details on what parts of the assignment that they have assisted you with
a table of contents and page numbers
tasks requiring written responses
list of references (including websites, the textbook and any other resources) used (APA style); please clearly specify if none have been used.
For each stage submission, submit the code project source code and your documentation in one zip file to Moodle.