001package edu.pdx.cs.joy.jdbc;
002
003import java.io.File;
004import java.sql.Connection;
005import java.sql.SQLException;
006import java.util.List;
007
008/**
009 * A command-line program that demonstrates CRUD operations on Department objects
010 * using the DepartmentDAO class with an H2 database.
011 */
012public class ManageDepartments {
013
014  /**
015   * Main method that performs CRUD operations on departments in an H2 database file.
016   *
017   * @param args command line arguments where args[0] is the path to the database file
018   *             and args[1] is the command (create, retrieve, update, delete, or list)
019   * @throws SQLException if a database error occurs
020   */
021  public static void main(String[] args) throws SQLException {
022    if (args.length < 2) {
023      printUsage();
024      return;
025    }
026
027    String dbFilePath = args[0];
028    String command = args[1].toLowerCase();
029
030    File dbFile = new File(dbFilePath);
031
032    try (Connection connection = H2DatabaseHelper.createFileBasedConnection(dbFile)) {
033      // Create the departments table if it doesn't exist
034      DepartmentDAOImpl.createTable(connection);
035
036      // Create a new DepartmentDAO
037      DepartmentDAO departmentDAO = new DepartmentDAOImpl(connection);
038
039      switch (command) {
040        case "create":
041          handleCreate(args, departmentDAO);
042          break;
043        case "retrieve":
044          handleRetrieve(args, departmentDAO);
045          break;
046        case "update":
047          handleUpdate(args, departmentDAO);
048          break;
049        case "delete":
050          handleDelete(args, departmentDAO);
051          break;
052        case "list":
053          handleList(departmentDAO);
054          break;
055        default:
056          System.err.println("Unknown command: " + command);
057          printUsage();
058      }
059    }
060  }
061
062  private static void printUsage() {
063    System.err.println("Usage: java ManageDepartments <database-file-path> <command> [args...]");
064    System.err.println();
065    System.err.println("Commands:");
066    System.err.println("  create <name>           - Create a new department with the given name");
067    System.err.println("  retrieve <id>           - Retrieve a department by ID");
068    System.err.println("  update <id> <name>      - Update the name of a department");
069    System.err.println("  delete <id>             - Delete a department by ID");
070    System.err.println("  list                    - List all departments");
071  }
072
073  private static void handleCreate(String[] args, DepartmentDAO departmentDAO) throws SQLException {
074    if (args.length < 3) {
075      System.err.println("Missing department name for create command");
076      System.err.println("Usage: java ManageDepartments <database-file-path> create <name>");
077      return;
078    }
079
080    String departmentName = args[2];
081    Department department = new Department(departmentName);
082    departmentDAO.save(department);
083
084    System.out.println("Successfully created department:");
085    System.out.println(department);
086    System.out.println("Auto-generated ID: " + department.getId());
087  }
088
089  private static void handleRetrieve(String[] args, DepartmentDAO departmentDAO) throws SQLException {
090    if (args.length < 3) {
091      System.err.println("Missing department ID for retrieve command");
092      System.err.println("Usage: java ManageDepartments <database-file-path> retrieve <id>");
093      return;
094    }
095
096    int id = Integer.parseInt(args[2]);
097    Department department = departmentDAO.findById(id);
098
099    if (department == null) {
100      System.out.println("No department found with ID: " + id);
101    } else {
102      System.out.println("Found department:");
103      System.out.println(department);
104    }
105  }
106
107  private static void handleUpdate(String[] args, DepartmentDAO departmentDAO) throws SQLException {
108    if (args.length < 4) {
109      System.err.println("Missing arguments for update command");
110      System.err.println("Usage: java ManageDepartments <database-file-path> update <id> <name>");
111      return;
112    }
113
114    int id = Integer.parseInt(args[2]);
115    String newName = args[3];
116
117    Department department = departmentDAO.findById(id);
118    if (department == null) {
119      System.out.println("No department found with ID: " + id);
120      return;
121    }
122
123    department.setName(newName);
124    departmentDAO.update(department);
125
126    System.out.println("Successfully updated department:");
127    System.out.println(department);
128  }
129
130  private static void handleDelete(String[] args, DepartmentDAO departmentDAO) throws SQLException {
131    if (args.length < 3) {
132      System.err.println("Missing department ID for delete command");
133      System.err.println("Usage: java ManageDepartments <database-file-path> delete <id>");
134      return;
135    }
136
137    int id = Integer.parseInt(args[2]);
138    Department department = departmentDAO.findById(id);
139
140    if (department == null) {
141      System.out.println("No department found with ID: " + id);
142      return;
143    }
144
145    departmentDAO.delete(id);
146    System.out.println("Successfully deleted department:");
147    System.out.println(department);
148  }
149
150  private static void handleList(DepartmentDAO departmentDAO) throws SQLException {
151    List<Department> allDepartments = departmentDAO.findAll();
152    System.out.println("Found " + allDepartments.size() + " department(s)");
153    for (Department dept : allDepartments) {
154      System.out.println("  " + dept);
155    }
156  }
157}