The purpose of this assignment is for you to get hands-on experience with designing, constructing and using a database for a real-world domain. You will see all aspects of database creation, from understanding the domain to using the final database from external applications.
To pass the programming assignment, you must pass all four tasks described on this page.
You must submit your solutions through the Fire reporting system. Read the separate notes on registering in the Fire system, submitting assignment tasks and requesting your group's ORACLE account.
You must submit your group's solutions to each task by the given deadline. After submission, your assignment will be graded ("pass" or "reject") and you will receive comments on your solution (for tasks 1, 2 and 3). If your submission is rejected, you are allowed to refine your solution and re-submit it. If your first submission is not a serious attempt (e.g. if you submit an empty file or if your solutions are seriously incomplete), your submission will be rejected and you will not be allowed to re-submit a revised solution.
To pass the final part of the assignment, you must demonstrate your system to one of the teachers. Your files for task 4 must be uploaded to the Fire system after you have demonstrated your system, and before the task 4 deadline.
Each consecutive task will be based on the previous, so it is one single assignment that you will do. It will not be possible to only do the fourth task for instance, since you will then have no database on which to build your application.
For each task you will hand in and get feedback on your results. You cannot continue with a later task before the previous one(s) are approved, so it is wise to hand in your solutions early to get more chances for feedback.
Be sure to read through the full description of the assignment before you start since the requirements we place on the system must influence your initial design as well.
The university for which you are building this system is organized into departments, such as the Dept. of Computing Science (CS), and study programmes for students, such as the Computer Science and Engineering programme (CSEP). Programmes are hosted by departments, but several departments may collaborate on a programme, which is the case with CSEP that is co-hosted by the CS department and the Department of Computer Engineering (CE). Department names and programme names are unique.
Each study programme is further divided into branches, for example CSEP has branches Computer Languages, Algorithms, Software Engineering etc. A student always belongs to a programme and a branch. Note that branch names are unique within a given program, but not necessarily across several programs. For instance, both CSEP and a programme in Automation Technology could have a branch called Interaction Design. For each study programme, there are mandatory courses. For each branch, there are additional mandatory courses that the students taking that branch must read. Branches also name a set of recommended courses from which all students taking that branch must read a certain amount to fulfill the requirements of graduation, see below.
Courses are given by a department (e.g. CS gives the Databases course), and may be read by students reading any study programme. Some courses may be mandatory for certain programmes, but not so for others. Some, but not all, courses have a restriction on the number of students that may take the course at the same time. Each course gives a certain number of credits. For simplicity we assume all students get the same amount of credits for a given course, regardless of which study programme or branch they belong to. Courses can be classified as being mathematical courses, research courses or seminar courses. Not all courses need to be classified, and some courses may have more than one classification. Some courses have prerequisites, i.e. other courses that must be read before a student is allowed to register for the course at hand.
Students need to register for courses in order to read them. To be allowed to register, the student must first fulfill all prerequisites for the course. It should not be possible to register to a course unless the prerequisite courses are already passed. It should not be possible for a student to register for a course which they have already passed.
If a course becomes full, subsequent registering students are put on a waiting list, and if one of the previously registered students decides to drop out, that slot on the course is given to the student who has waited the longest. When the course is finished, all students are graded on a scale of 'U', '3', '4', '5'. Getting a 'U' means the student has not passed the course, while the other grades denote various degrees of success.
For a student to graduate there are a number of requirements she must first fulfill. She must have passed (have at least grade 3) in all mandatory courses of the study programme she belongs to, as well as the mandatory courses of the particular branch. Also she must have passed at least 10 credits worth of courses among the mandatory and recommended courses for the branch. Furthermore she needs to have read and passed (at least) 20 credits worth of courses classified as mathematical courses, 10 credits worth of courses classified as research courses, and one seminar course. Mandatory and recommended courses that are also classified in some way are counted just like any other course. As an example, if one of the mandatory courses of a programme is also a seminar course, students of that programme will not be required to read any more seminar courses.
Formally, your system should have the following modes:
For task 1, you should hand in
The last three could be given as a single file if you like. No .doc files!
We recommend that you check your solution against these common errors in Task 1 before submitting your work.
Deadline: Tuesday 2011-11-08 (before 23:59)
When your design of the database has been approved, the next task is to construct the database by implementing the database schema in a database engine (Oracle).
For task 2, you should hand in
Note that SQL code should be in plain text format. Make sure that iSQLPlus can execute your files before you hand them in. Test this by clearing out your database (e.g. using the instructions for deleting everything) and then running your SQL files.
Deadline: Tuesday 2011-11-22 (before 23:59)
When a student tries to register for a course, it is possible that the course is already full, in which case the student should be put in the waiting list for that course. When a student unregisters, it might be that some student is in the waiting list, and should then be registered for the course instead. Such things are typically handled via triggers. You should write two triggers that:
Prepare test cases (in SQL) for testing both insertion and deletion to check that the triggers work. Make sure your test suite covers all the points listed under task 4, that we will check the complete application for.
Some useful links:
For task 3, you should hand in
Note that SQL code should be in plain text format. Make sure that iSQLPlus can execute your files before you hand them in.
Deadline: Thursday 2011-12-01 (before 23:59)
The last part of this assignment is to write an application that students can use to communicate with your database. This application should be a Java program that uses JDBC to connect to the Oracle database to request and insert the proper data.
To your help when writing your application we provide you with a stub file that contains the code for connecting to Oracle on the local system. It also contains hooks for the three operating modes of the application, and this is where you should insert your code. The idea is that you should not need to focus so much on the pure Java parts of the application, but rather get straight down to business with the database-interfacing code.
The stub file, StudentPortal.java, looks like this:
import java.sql.*; // JDBC stuff. import java.io.*; // Reading user input. public class StudentPortal { /* This is the driving engine of the program. It parses the * command-line arguments and calls the appropriate methods in * the other classes. * * You should edit this file in two ways: * 1) Insert your database username and password (no @medic1!) * in the proper places. * 2) Implement the three functions getInformation, registerStudent * and unregisterStudent. */ public static void main(String[] args) { if (args.length == 1) { try { DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); String url = "jdbc:oracle:thin:@tycho.ita.chalmers.se:1521/kingu.ita.chalmers.se"; String userName = ""; // Your username goes here! String password = ""; // Your password goes here! Connection conn = DriverManager.getConnection(url,userName,password); String student = args[0]; // This is the identifier for the student. BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Welcome!"); while(true) { System.out.println("Please choose a mode of operation:"); System.out.print("? > "); String mode = input.readLine(); if ((new String("information")).startsWith(mode.toLowerCase())) { /* Information mode */ getInformation(conn, student); } else if ((new String("register")).startsWith(mode.toLowerCase())) { /* Register student mode */ System.out.print("Register for what course? > "); String course = input.readLine(); registerStudent(conn, student, course); } else if ((new String("unregister")).startsWith(mode.toLowerCase())) { /* Unregister student mode */ System.out.print("Unregister from what course? > "); String course = input.readLine(); unregisterStudent(conn, student, course); } else if ((new String("quit")).startsWith(mode.toLowerCase())) { System.out.println("Goodbye!"); break; } else { System.out.println("Unknown argument, please choose either " + "information, register, unregister or quit!"); continue; } } conn.close(); } catch (SQLException e) { System.err.println(e); System.exit(2); } catch (IOException e) { System.err.println(e); System.exit(2); } } else { System.err.println("Wrong number of arguments"); System.exit(3); } } static void getInformation(Connection conn, String student) { // Your implementation here } static void registerStudent(Connection conn, String student, String course) { // Your implementation here } static void unregisterStudent(Connection conn, String student, String course) { // Your implementation here } }
The intended behavior of the program is that you use if from the command line, giving some student identification number as an argument (what exactly that is depends on your design). This corresponds to the student "logging on" to the portal. Once logged on, the student can choose one of the three modes "Information", "Register" or "Unregister". If the first is chosen, all information for that student should be printed. Exactly what information must be printed is given by the system requirements specified above. If one of the latter modes are chosen, the student will be prompted for a course to register to or unregister from, and the application should perform the requested operation and print the result (success, failure).
The stub file above can be compiled and run as it is, only nothing will happen in any of the modes. Your task is thus to fill in the actual logic of these three tasks.
Running your application could look like this:
$> java StudentPortal 123456-7890 Welcome! Please choose a mode of operation: ? > Information Information for student 123456-7890 ------------------------------------- Name: Emilia Emilsson Line: Information Technology (IT) Branch: Systems Development Read courses (name (code), credits: grade): Set Theory (MAT050), 5p: 5 Functional Programming (TDA450), 10p: 5 Object-Oriented Systems Development (TDA590), 10p: 4 Registered courses (name (code), credits: status): Databases (TDA356), 5p: registered Algorithms (TIN090), 5p: waiting as nr 3 Seminar courses taken: 0 Math credits taken: 5 Research credits taken: 0 Total credits taken: 25 Fulfills the requirements for graduation: no ------------------------------------- Please choose a mode of operation: ? > Register Register to what course? > TDA350 You are now successfully registered to course TDA350 Cryptograhy! Please choose a mode of operation: ? > Register Register to what course? > TDA381 Course TDA381 Concurrent Programming is full, you are put in the waiting list as number 2. Please choose a mode of operaion: ? > Quit Goodbye! $>
Note that the formatting here is only a suggestion, you may choose to format your output differently as long as you give the proper information back to the user.
To get access to the jdbc drivers from your application, you should import the following into your java CLASSPATH:/chalmers/sw/sup/oracle_10201_client/jdbc/lib/ojdbc14.jar.
For task 4 you should hand in
However, the fourth task will not be corrected through the submission system, even though you should still submit your source code. Instead you should come to one of the supervision sessions and demonstrate your running application, and we will accept or reject it on the spot. As you probably realize, if all of you wait until the last Friday we will quite simply not have time for everyone, so come early!
Here is a list of what we will test your application for:
Deadline: Friday 2011-12-09, at the practical session