From 2b82a0f2057d86c135d37133945f37fa61cb391b Mon Sep 17 00:00:00 2001 From: thelzya Date: Fri, 6 Mar 2020 20:49:22 +0800 Subject: [PATCH] Assignment 1 & 2 --- assignment-01/README.md | 149 --------------------------- assignment-01/Student.java | 77 ++++++++++++++ assignment-01/assets/classobject.pdf | Bin 35188 -> 0 bytes assignment-01/assets/classobject.png | Bin 33267 -> 0 bytes assignment-01/main.java | 58 +++++++++++ assignment-02/DataSource.java | 86 ++++++++++++++++ assignment-02/Login.java | 55 ++++++++++ assignment-02/Main.java | 15 +++ assignment-02/User.java | 78 ++++++++++++++ assignment-02/User.txt | 5 + assignment-02/UserDetail.java | 29 ++++++ assignment-02/UserDetail.txt | 5 + 12 files changed, 408 insertions(+), 149 deletions(-) delete mode 100755 assignment-01/README.md create mode 100644 assignment-01/Student.java delete mode 100755 assignment-01/assets/classobject.pdf delete mode 100755 assignment-01/assets/classobject.png create mode 100644 assignment-01/main.java create mode 100644 assignment-02/DataSource.java create mode 100644 assignment-02/Login.java create mode 100644 assignment-02/Main.java create mode 100644 assignment-02/User.java create mode 100644 assignment-02/User.txt create mode 100644 assignment-02/UserDetail.java create mode 100644 assignment-02/UserDetail.txt diff --git a/assignment-01/README.md b/assignment-01/README.md deleted file mode 100755 index ee89b91..0000000 --- a/assignment-01/README.md +++ /dev/null @@ -1,149 +0,0 @@ -# Buatlah Class Berdasarkan Class Diagram Berikut - -

Class Diagram

- -## Penjelasan Atribut : -- Setiap atribut yang memiliki << set/get >> berarti memiliki method setter dan getter default, bentuk setter getter default adalah sebagai berikut : - ```java - class Sample { - private String attributeSample; - - // Setter default untuk atribut attributeSample - // Tipe data parameter method = tipe data atribut - public void setAttributeSample(String attributeSample) { - /** - * Proses Lainnya - */ - this.attributeSample = attributSample; - } - - // Getter default untuk atribut attributeSample - // Return type method = tipe data atribut - public String getAttributeSample() { - /** - * Proses Lainnya - */ - return attributeSample; - } - } - ``` -- Atribut yang memiliki << set >>, berarti hanya memiliki method setter default. -- _Method body_ menyesuaikan dengan alur yang dibutuhkan. -- Jika pada bagian _behaviour_ terdapat method `setter`, maka bentuk method `setter` yang digunakan adalah yang terdapat pada bagian _behaviour_ - -## Penjelasan Behaviour : -- `setId(facultyMap : Map, majorMap : Map) : void` : Berfungsi untuk mengatur atribut `id` (NIM), dimana `id` dibentuk dari : - ``` - Kode Fakultas + Kode Prodi + 1 + Dua Digit Terakhir registerYear + 1 + 3 Digit Angka Random Dari 001 - 060 - ``` - Kode Fakultas dan Kode Prodi didapat dari `facultyMap` dan `majorMap` yang berupa `HasMap` pada `main` method dimana `key`-nya adalah nama fakultas dan nama prodi, kemudian `value`-nya adalah kode fakultas dan kode prodi. -- `setEmail(facultyMap : Map) : void` : Berfungsi untuk mengatur atribut `email`, dimana `email` dibentuk dari : - ``` - Suku Kata Terakhir Nama + Huruf Pertama Setiap Suku Kata Nama Dari Awal Sampai Sebelum Suku Kata Terakhir + 2 Digit Terakhir registerYear + Kode Fakultas + @student.unhas.ac.id - ``` - format `email` harus _lower case_ tanpa spasi. -- `getFullName(): String` : Mengembalikan Nama Lengkap dalam betuk _Upper Camel Case_ yang merupakan hasil dari penggabungan `firstName` dan `lastName` yang dipisahkan oleh 1 spasi. -- `description() : void` : Mencetak data Mahasiswa dengan format sebagai berikut : - ``` - Nama : Muhammad Fitrah - NIM : H071171035 - Email Mahasiswa : fitrahm17h@student.unhas.ac.id - Fakultas : MIPA - Departemen : Matematika - Program Studi : Ilmu Komputer - ``` - -## Kemudian Buatlah _Class Main_ dengan _main Method_ Untuk Melakukan Instansiasi _Class Student_ Dengan Ketentuan Sebagai Berikut : -- Terdapat `Map facultyCode` untuk menampung data Nama Fakultas dan Kode Fakultas. -- Terdapat `Map majorCode` untuk menampung data Nama Prodi dan Kode Prodi. -- Memanggil method `description()` dari setiap hasil instansiasi class `Student` - -Berikut Contoh _main method_ beserta outputnya : -```java -import java.util.HashMap; -import java.util.Map; - -public class Main { - - public static void main(String[] args) { - Map facultyMap = new HashMap<>(); - Map majorMap = new HashMap<>(); - facultyMap.put("Nama Fakultas Lain", "A"); - facultyMap.put("Nama Fakultas Lain", "B"); - facultyMap.put("Nama Fakultas Lain", "C"); - facultyMap.put("Nama Fakultas Lain", "D"); - facultyMap.put("Nama Fakultas Lain", "E"); - facultyMap.put("Nama Fakultas Lain", "F"); - facultyMap.put("Nama Fakultas Lain", "G"); - facultyMap.put("MIPA", "H"); - majorMap.put("Prodi Lain", "01"); - majorMap.put("Prodi Lain", "02"); - majorMap.put("Prodi Lain", "03"); - majorMap.put("Prodi Lain", "04"); - majorMap.put("Prodi Lain", "05"); - majorMap.put("Prodi Lain", "06"); - majorMap.put("Ilmu Komputer", "07"); - - Student student1 = new Student(); - Student student2 = new Student(); - Student student3 = new Student(); - - student1.setFirstName("mUHammAd"); - student1.setLastName("fITRAH"); - student1.setRegisterYear(2017); - student1.setFaculty("MIPA"); - student1.setDepartment("Matematika"); - student1.setMajor("Ilmu Komputer"); - student1.setId(facultyMap, majorMap); - student1.setEmail(facultyMap); - - student2.setFirstName("KENNEDY"); - student2.setLastName(""); - student2.setRegisterYear(2017); - student2.setFaculty("MIPA"); - student2.setDepartment("Matematika"); - student2.setMajor("Ilmu Komputer"); - student2.setId(facultyMap, majorMap); - student2.setEmail(facultyMap); - - student3.setFirstName("Khawaritzmi"); - student3.setLastName("abdallah ahmad"); - student3.setRegisterYear(2017); - student3.setFaculty("MIPA"); - student3.setDepartment("Matematika"); - student3.setMajor("Ilmu Komputer"); - student3.setId(facultyMap, majorMap); - student3.setEmail(facultyMap); - - student1.description(); - student2.description(); - student3.description(); - - } -} -``` -Output : - ``` - Nama : Muhammad Fitrah - NIM : H071171035 - Email Mahasiswa : fitrahm17h@student.unhas.ac.id - Fakultas : MIPA - Departemen : Matematika - Program Studi : Ilmu Komputer - - Nama : Kennedy - NIM : H071171021 - Email Mahasiswa : kennedy17h@student.unhas.ac.id - Fakultas : MIPA - Departemen : Matematika - Program Studi : Ilmu Komputer - - Nama : Khawaritzmi Abdallah Ahmad - NIM : H071171002 - Email Mahasiswa : ahmadka17h@student.unhas.ac.id - Fakultas : MIPA - Departemen : Matematika - Program Studi : Ilmu Komputer - ``` - -- Jika gambar _class diagram_ ditas kurang jelas, silahkan unduh [Class Diagram.pdf](assets/classobject.pdf). \ No newline at end of file diff --git a/assignment-01/Student.java b/assignment-01/Student.java new file mode 100644 index 0000000..0f0c924 --- /dev/null +++ b/assignment-01/Student.java @@ -0,0 +1,77 @@ +import java.util.Map; +import java.util.Random; +public class Student{ + private String id; + private String firstName; + private String lastName; + + private String email; + private int registerYear; + private String faculty; + private String departemen; + private String major; + + public void setId(MapfacultyMap, MapmajorMap){ + Random randoms = new Random(); + this.id = facultyMap.get(faculty) + majorMap.get(major) + "1" + String.valueOf(registerYear).substring(2) + "1" + String.format("%03d", randoms.nextInt(061)); + } + public String getId(){ + return id; + } + public void setFirstName(String firstName){ + + this.firstName = firstName; + } + public void setLastName(String lastName){ + this.lastName = lastName; + } + public String getFullName(){ + String fullName[] = (firstName.toLowerCase() + " " + lastName.toLowerCase()).split(" "); + String Name = ""; + for (int i = 0; i < fullName.length;i++) { + Name+= fullName[i].substring(0,1).toUpperCase()+ fullName[i].substring(1) + " "; + } + return Name; + } + public void setRegisterYear(Integer registerYear){ + this.registerYear = registerYear; + } + public void setFaculty(String faculty){ + this.faculty = faculty; + } + public String getFaculty(String faculty){ + return faculty; + } + public void setDepartment(String departemen){ + this.departemen = departemen; + } + public String getDepartment(String departemen){ + return departemen; + } + public void setMajor(String major){ + this.major = major; + } + public String getMajor(){ + return major; + } + public void setEmail(MapfacultyMap){ + String fullName[] = (firstName.toLowerCase() + " " + lastName.toLowerCase()).split(" "); + String Name = ""; + for (int i = 0; i < fullName.length -1;i++) { + Name+= fullName[i].substring(0,1); + } + this.email = (fullName[fullName.length - 1]+ Name + String.valueOf(registerYear).substring(2) + facultyMap.get(faculty) + "@gmail.com").toLowerCase(); + } + public String getEmail(String email){ + return email; + } + public void description() { + System.out.println("Nama : " + getFullName() ); + System.out.println("NIM : " + getId()); + System.out.println("Email Mahasiswa : " + getEmail(email)); + System.out.println("Fakultas : " + getFaculty(faculty)); + System.out.println("Departemen : " + getDepartment(departemen)); + System.out.println("Program Studi : " + getMajor()); + System.out.println(); + } +} \ No newline at end of file diff --git a/assignment-01/assets/classobject.pdf b/assignment-01/assets/classobject.pdf deleted file mode 100755 index 5b8b55c5572eabb06ac387f0e66f2e5f15ad3ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35188 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 or8)fX%1wV(ANcD7^+uz9W?O}~HnEF~9)H facultyMap = new HashMap<>(); + Map majorMap = new HashMap<>(); + facultyMap.put("Nama Fakultas Lain", "A"); + facultyMap.put("Nama Fakultas Lain", "B"); + facultyMap.put("Nama Fakultas Lain", "C"); + facultyMap.put("Nama Fakultas Lain", "D"); + facultyMap.put("Nama Fakultas Lain", "E"); + facultyMap.put("Nama Fakultas Lain", "F"); + facultyMap.put("Nama Fakultas Lain", "G"); + facultyMap.put("MIPA", "H"); + majorMap.put("Prodi Lain", "01"); + majorMap.put("Prodi Lain", "02"); + majorMap.put("Prodi Lain", "03"); + majorMap.put("Prodi Lain", "04"); + majorMap.put("Prodi Lain", "05"); + majorMap.put("Prodi Lain", "06"); + majorMap.put("Ilmu Komputer", "07"); + + Student student1 = new Student(); + Student student2 = new Student(); + Student student3 = new Student(); + + student1.setFirstName("mUHammAd"); + student1.setLastName("fITRAH"); + student1.setRegisterYear(2017); + student1.setFaculty("MIPA"); + student1.setDepartment("Matematika"); + student1.setMajor("Ilmu Komputer"); + student1.setId(facultyMap, majorMap); + student1.setEmail(facultyMap); + + student2.setFirstName("KENNEDY"); + student2.setLastName(""); + student2.setRegisterYear(2017); + student2.setFaculty("MIPA"); + student2.setDepartment("Matematika"); + student2.setMajor("Ilmu Komputer"); + student2.setId(facultyMap, majorMap); + student2.setEmail(facultyMap); + + student3.setFirstName("Khawaritzmi"); + student3.setLastName("abdallah ahmad"); + student3.setRegisterYear(2017); + student3.setFaculty("MIPA"); + student3.setDepartment("Matematika"); + student3.setMajor("Ilmu Komputer"); + student3.setId(facultyMap, majorMap); + student3.setEmail(facultyMap); + + student1.description(); + student2.description(); + student3.description(); + + } +} \ No newline at end of file diff --git a/assignment-02/DataSource.java b/assignment-02/DataSource.java new file mode 100644 index 0000000..4fe76f3 --- /dev/null +++ b/assignment-02/DataSource.java @@ -0,0 +1,86 @@ +import java.util.HashMap; +import java.util.Map; +import java.io.FileReader; +import java.io.BufferedReader; + + +public class DataSource { + + private static DataSource dataSource; + private Map userMap = new HashMap<>(); + private Map userDetailMap = new HashMap<>(); + + private DataSource() { + try{ + putUserDetail(); + putUser(); + } catch(Exception e) { + e.printStackTrace(); + } + } + + public static DataSource getInstance() { + if(dataSource == null){ + dataSource = new DataSource(); + } + return dataSource; + } + + private void putUserDetail() throws Exception{ + // This Method Reads data from the UserDetail.txt file, then saves the data + // into UserDetailMap + BufferedReader br = new BufferedReader(new FileReader("UserDetail.txt")); + String data[]; + while(br.ready()){ + data = br.readLine().split(";"); + //inputs user detail into user detail Map if the data starts with a valid id + if(isInteger(data[0])){ + userDetailMap.put(Integer.valueOf(data[0]), + new UserDetail(Integer.valueOf(data[0]), data[1], data[2], data[3])); + + } + } + data = null; + br.close(); + } + + private void putUser() throws Exception{ + // This Method Reads data from the User.txt file, then saves the data + // into UserMap + BufferedReader br = new BufferedReader(new FileReader("User.txt")); + String data[]; + while(br.ready()){ + data = br.readLine().split(";"); + // inputs user into userMap if the data starts with a valid id + if(isInteger(data[0])){ + userMap.put(data[1], new User(Integer.valueOf(data[0]), data[1], data[2], + userDetailMap.get(Integer.valueOf(data[0])))); + } + } + data = null; + br.close(); + } + + public User getUser(String key) { + return userMap.get(key); + } + public UserDetail getUserDetail(int key) { + return userDetailMap.get(key); + } + + public static boolean isInteger(String s) { + //This method checks if a string is an integer + boolean isValidInteger = false; + try { + Integer.parseInt(s); + // s is a valid integer + + isValidInteger = true; + } catch (NumberFormatException ex) { + // s is not an integer + } + + return isValidInteger; + } + +} \ No newline at end of file diff --git a/assignment-02/Login.java b/assignment-02/Login.java new file mode 100644 index 0000000..150ec5a --- /dev/null +++ b/assignment-02/Login.java @@ -0,0 +1,55 @@ +import java.util.*; +public class Login { + + private static Login login; + private User user; + private UserDetail userDetail; + private DataSource dataSource; + + private Login() { + dataSource = DataSource.getInstance(); + } + + public static Login getInstance() { + if(login == null){ + login = new Login(); + } + return login; + } + public void auth(String userName, String password) throws NoSuchElementException { + user = dataSource.getUser(userName); + try { + if(user.verifyPassword(password)){ + userDetail = user.getUserDetail(); + } else { + System.out.println("Invalid Password"); + } + } catch (Exception e) { + throw new NoSuchElementException("No such Username : " + userName); + } + } + + public void status() { + try{ + System.out.printf("Name\t\t: %s\n", userDetail.getName()); + System.out.printf("Email\t\t: %s\n", userDetail.getEmail()); + System.out.printf("Date of Birth\t: %s\n", userDetail.getDateOfBirth()); + System.out.printf("Username\t: %s\n", user.getUsername()); + System.out.printf("Password\t: %s\n", user.getPassword()); + } catch (Exception e) { + System.out.println("Not Logged in"); + } + } + + public void logout() { + if(user != null){ + user.logout(); + user = null; + userDetail = null; + } else { + System.out.println("Not logged in"); + } + + } + +} \ No newline at end of file diff --git a/assignment-02/Main.java b/assignment-02/Main.java new file mode 100644 index 0000000..973180f --- /dev/null +++ b/assignment-02/Main.java @@ -0,0 +1,15 @@ +public class Main { + public static void main(String[] args) throws Exception{ + Login login = Login.getInstance(); + + login.auth("naim", "Naim"); + login.status(); + login.logout(); + + System.out.println(""); + + login.auth("Farha", "parhan"); + login.status(); + login.logout(); + } +} \ No newline at end of file diff --git a/assignment-02/User.java b/assignment-02/User.java new file mode 100644 index 0000000..1a9497e --- /dev/null +++ b/assignment-02/User.java @@ -0,0 +1,78 @@ +public class User { + // This class contains the login details of a user + private int id; + private String userName; + private String password; + private UserDetail userDetail; + private boolean authenticated = false; // prevents access to vital information + // without authentication + + public User(int id, String userName, String password, UserDetail userDetail) { + this.id = id; + this.userName = userName; + this.password = password; + this.userDetail = userDetail; + } + + public UserDetail geUserDetail() { + if (authenticated) { + return userDetail; + } else { + System.out.println("Not Authenticated"); + return null; + } + } + + public int getId() { + if (authenticated) { + return id; + } else { + System.out.println("Not Authenticated"); + return 0; + } + } + + public boolean verifyPassword(String password) { + //this method authenticates the user if the password is correct + if(this.password.equals(password)) { + //if password is correct then authenticate the user + authenticated = true; + return true; + } else { + //if the password is incorrect then don't authenticate the user + return false; + } + } + + public String getUsername() { + if (authenticated) { + return userName; + } else { + System.out.println("Not Authenticated"); + return null; + } + } + + public UserDetail getUserDetail() { + if (authenticated) { + return userDetail; + } else { + System.out.println("Not Authenticated"); + return null; + } + } + + public String getPassword() { + if (authenticated) { + return password; + } else { + System.out.println("Not Authenticated"); + return null; + } + } + + public void logout() { + authenticated = false; + } + +} \ No newline at end of file diff --git a/assignment-02/User.txt b/assignment-02/User.txt new file mode 100644 index 0000000..70d291f --- /dev/null +++ b/assignment-02/User.txt @@ -0,0 +1,5 @@ +1;fitrh;12345678 +2;arzk;qwerty +3;ken;asdf +4;naim;Naim +5;farhan;Parhan \ No newline at end of file diff --git a/assignment-02/UserDetail.java b/assignment-02/UserDetail.java new file mode 100644 index 0000000..d07db4c --- /dev/null +++ b/assignment-02/UserDetail.java @@ -0,0 +1,29 @@ +public class UserDetail { + + private Integer id; + private String name; + private String dateOfBirth; + private String email; + + public UserDetail(Integer id, String name, String dateOfBirth, String email) { + this.id = id; + this.name = name; + this.dateOfBirth = dateOfBirth; + this.email = email; + } + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDateOfBirth() { + return dateOfBirth; + } + + public String getEmail() { + return email; + } +} \ No newline at end of file diff --git a/assignment-02/UserDetail.txt b/assignment-02/UserDetail.txt new file mode 100644 index 0000000..908948c --- /dev/null +++ b/assignment-02/UserDetail.txt @@ -0,0 +1,5 @@ +1;Muhammad Fitrah;04-09-1998;fitrahm17h@student.unhas.ac.id +2;Muhammad Arizki;00-00-0000;arizkim17h@student.unhas.ac.id +3;Kennedy;00-02-2000;kennedy17h@student.unhas.ac.id +4;Muhammad Muflihun Naim;00-00-0000;naimmm17h@student.unhas.ac.id +5;Farhan Ramdhani;00-00-0000;ramdhanif17h@student.unhas.ac.id \ No newline at end of file