@startuml addRoomController
mainframe **sd** Add Room Controller
hide footbox
actor User
participant "Browser" as Browser
participant "ManagerFilter" as ManagerFilter
participant ":AddRoomController" as AddRoomController
participant "Helper" as Helper
participant "GetParam" as GetParam
participant ":RoomDAO" as RoomDAO
participant "Database" as Database

User ->> Browser: Click on add room link
activate Browser
Browser ->> ManagerFilter: **GET** /AddRoomController
activate ManagerFilter
ManagerFilter ->> ManagerFilter: Context.lookup(String name): Object
ManagerFilter ->> Helper: protectedRouter(HttpServletRequest request, HttpServletResponse response, int minRole, int maxRole, String page): boolean
activate Helper
Helper ->> Helper: isLogin(HttpServletRequest request): boolean
Helper ->> Helper: correctRole(HttpServletRequest request, int minRole, int maxRole): boolean
Helper -->> ManagerFilter: Return result
deactivate Helper

alt action does not allow
    ManagerFilter -->> Browser: forward login.jsp

else action allows
    ManagerFilter ->> AddRoomController: doFilter(ServletRequest arg0, ServletResponse arg1): void
    activate AddRoomController
    AddRoomController ->> RoomDAO: getRoomTypes(): ArrayList<RoomType>
    activate RoomDAO
    RoomDAO ->> Database: executeQuery(): ResultSet
    activate Database
    Database -->> RoomDAO: Return ResultSet
    deactivate Database
    RoomDAO -->> AddRoomController: Return ArrayList<RoomTypes>
    deactivate RoomDAO

    alt null
        AddRoomController -->> ManagerFilter: redirect /RoomListController
        ManagerFilter -->> Browser: redirect /RoomListController
    else not null
        AddRoomController -->> ManagerFilter: forward addRoom.jsp
        ManagerFilter -->> Browser: forward addRoom.jsp
        deactivate AddRoomController
        deactivate ManagerFilter
    end
end

User ->> Browser: Submit add room form
Browser ->> ManagerFilter: **POST** /AddRoomController
activate ManagerFilter
ManagerFilter ->> ManagerFilter: Context.lookup(String name): Object
ManagerFilter ->> Helper: protectedRouter(HttpServletRequest request, HttpServletResponse response, int minRole, int maxRole, String page): boolean
activate Helper
Helper ->> Helper: isLogin(HttpServletRequest request): boolean
Helper ->> Helper: correctRole(HttpServletRequest request, int minRole, int maxRole): boolean
Helper -->> ManagerFilter: Return result
deactivate Helper

alt action does not allow
    ManagerFilter -->> Browser: forward login.jsp

else action allows
    ManagerFilter ->> AddRoomController: doFilter(ServletRequest arg0, ServletResponse arg1): void
    activate AddRoomController
    AddRoomController ->> GetParam: getIntParams(HttpServletRequest request, String field, String label, int min, int max, Integer defaultValue): Integer
    activate GetParam
    GetParam -->> AddRoomController: Return roomId, statusParams, roomTypeId
    AddRoomController ->> GetParam: getFloatParams(HttpServletRequest request, String field, String label, float min, float max, Float defaultValue): Float
    GetParam -->> AddRoomController: Return price
    AddRoomController ->> GetParam: String getStringParam(HttpServletRequest request, String field, String label, int min, int max, String defaultValue): String
    GetParam -->> AddRoomController: Return description
    AddRoomController ->> GetParam:getFileParam(HttpServletRequest request, String field, String label, long maxSize, String[] extension): String
    GetParam -->> AddRoomController: Return imageUrl
    deactivate GetParam

    alt invalid data
        AddRoomController ->> RoomDAO: getRoomTypes(): ArrayList<RoomType>
        activate RoomDAO
        RoomDAO ->> Database: executeQuery(): ResultSet
        activate Database
        Database -->> RoomDAO: Return ResultSet
        deactivate Database
        RoomDAO -->> AddRoomController: Return ArrayList<RoomTypes>
        deactivate RoomDAO

        alt null
            AddRoomController -->> ManagerFilter: redirect /RoomListController
            ManagerFilter -->> Browser: redirect /RoomListController
        else not null
            AddRoomController -->> ManagerFilter: forward addRoom.jsp
            ManagerFilter -->> Browser: forward addRoom.jsp
        end
    else valid data
        AddRoomController ->> RoomDAO: getRoomTypeById(Integer roomTypeId): RoomType
        activate RoomDAO
        RoomDAO ->> Database: executeQuery(): ResultSet
        activate Database
        Database -->> RoomDAO: Return Result
        deactivate Database
        RoomDAO -->> AddRoomController: Return RoomType
        deactivate RoomDAO
        alt null
            AddRoomController ->> RoomDAO: getRoomTypes(): ArrayList<RoomType>
            activate RoomDAO
            RoomDAO ->> Database: executeQuery(): ResultSet
            activate Database
            Database -->> RoomDAO: Return ResultSet
            deactivate Database
            RoomDAO -->> AddRoomController: Return ArrayList<RoomTypes>
            deactivate RoomDAO

            alt null
                AddRoomController -->> ManagerFilter: redirect /RoomListController
                ManagerFilter -->> Browser: redirect /RoomListController
            else not null
                AddRoomController -->> ManagerFilter: forward addRoom.jsp
                ManagerFilter -->> Browser: forward addRoom.jsp
        else not null
            AddRoomController ->> RoomDAO: getRoomById(int roomId): Room
            activate RoomDAO
            RoomDAO ->> Database: executeQuery(): ResultSet
            activate Database
            Database -->> RoomDAO: Return ResultSet
            deactivate Database
            RoomDAO -->> AddRoomController: Return Room
            deactivate RoomDAO 

            alt null 
                AddRoomController ->> RoomDAO: getRoomTypes(): ArrayList<RoomType>
                activate RoomDAO
                RoomDAO ->> Database: executeQuery(): ResultSet
                activate Database
                Database -->> RoomDAO: Return ResultSet
                deactivate Database
                RoomDAO -->> AddRoomController: Return ArrayList<RoomTypes>
                deactivate RoomDAO

                alt null
                    AddRoomController -->> ManagerFilter: redirect /RoomListController
                    ManagerFilter -->> Browser: redirect /RoomListController
                else not null
                    AddRoomController -->> ManagerFilter: forward addRoom.jsp
                    ManagerFilter -->> Browser: forward addRoom.jsp
                end
            else not null
                AddRoomController ->> RoomDAO: addRoom(Room room): boolean
                activate RoomDAO
                RoomDAO ->> Database: executeUpdate(): int
                activate Database
                Database -->> RoomDAO: Return result
                deactivate Database
                RoomDAO -->> AddRoomController: Return result
                deactivate RoomDAO

                alt false
                    AddRoomController ->> RoomDAO: getRoomTypes(): ArrayList<RoomType>
                    activate RoomDAO
                    RoomDAO ->> Database: executeQuery(): ResultSet
                    activate Database
                    Database -->> RoomDAO: Return ResultSet
                    deactivate Database
                    RoomDAO -->> AddRoomController: Return ArrayList<RoomTypes>
                    deactivate RoomDAO

                    alt null
                        AddRoomController -->> ManagerFilter: redirect /RoomListController
                        ManagerFilter -->> Browser: redirect /RoomListController
                    else not null
                        AddRoomController -->> ManagerFilter: forward addRoom.jsp
                        ManagerFilter -->> Browser: forward addRoom.jsp
                    end
                else true
                    AddRoomController -->> ManagerFilter: redirect /RoomListController
                    deactivate AddRoomController
                    ManagerFilter -->> Browser: redirect /RoomListController
                    deactivate Browser
                    deactivate ManagerFilter
                end
            end
        end
    end
end
@enduml