0

私はプログラミングの世界に不慣れで、大好きです。

さまざまな役割で Query.Filter Operator に問題があります。

  • 管理者 - 管理者はすべての休暇履歴を表示できます
  • スーパーバイザー - スーパーバイザーは、彼/彼女の下にある自分とすべての従業員を表示できます
  • 従業員 - 従業員は自分の休暇履歴のみを表示できます

私が行ったテストから。管理者と従業員は正常に機能しており、私が直面した問題はスーパーバイザーであり、スーパーバイザーは従業員を自分の下で表示できますが、自分の休暇履歴を表示できません

ここにコードの一部があります。誰でも助けていただければ幸いです。ありがとうございました

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    log.debug(ViewHistory.class);
    DataTableModel dataTableModel = DataTablesUtility.getParam(request);
    String regionSelected = request.getParameter("cri_region");
    String sEcho = dataTableModel.sEcho;
    int iTotalRecords = 0; // total number of records (unfiltered)
    int iTotalDisplayRecords = 0; //value will be set when code filters companies by keyword
    JsonArray data = new JsonArray(); //data that will be shown in the table

    String emailAddress = (String)request.getSession().getAttribute("emailAdd");
    Boolean isAdmin = false;
    Boolean isSupervisor = false;

    AdministratorService as = new AdministratorService();
    for(Administrator admin : as.getAdministrators()){
        if(admin.getEmailAddress().equalsIgnoreCase(emailAddress)){
            isAdmin = true;
        }
    }

    SupervisorService ss = new SupervisorService();
    for(Supervisor s : ss.getSupervisors()){
        if(s.getEmailAddress().equalsIgnoreCase(emailAddress)){
            isSupervisor = true;
        }
    }

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Query q = new Query(History.class.getSimpleName());
            // only admin can view all leave history
            if(!isAdmin && !isSupervisor){
                Filter emailFilter = new FilterPredicate("emailAdd",
                        FilterOperator.EQUAL,
                        emailAddress);
                Filter regionFilter = new FilterPredicate("region",
                        FilterOperator.EQUAL,
                        StringUtils.defaultString(regionSelected, "Singapore"));
                Filter filter = CompositeFilterOperator.and(emailFilter, regionFilter);
                q.setFilter(filter);
            }
            else if(!isAdmin && isSupervisor){
                List<String> list = new ArrayList<String>();
                EmployeeService es = new EmployeeService();
                for(Employee emp : es.getEmployees()){
                    if(emailAddress.equalsIgnoreCase(emp.getSupervisor())){
                        list.add(emp.getEmailAddress());
                    }
                }

                // if some one under this supervisor
                if(list != null && !list.isEmpty()){
                    Filter filter = new FilterPredicate("emailAdd",
                            FilterOperator.IN,
                            list);
                    q.setFilter(filter);
                }
                else{
                    // if not one under this supervisor , put update it self to avoid illegal argument
                    Filter filter = new FilterPredicate("emailAdd",
                            FilterOperator.EQUAL,
                            emailAddress);
                    q.setFilter(filter);
                }

            }

    List<History> historyList = new LinkedList<History>();
    List<History> entityList = new LinkedList<History>();
4

1 に答える 1

0

編集:提案を更新しました。

現在、スーパーバイザーの場合、彼をスーパーバイザーとして持つすべての従業員のリストを正しく取得できる場合は、スーパーバイザーの電子メールを、休暇履歴をクエリするためのフィルターとして使用するリストに追加するだけです。したがって、従業員の電子メールのリストを見つけたら、次も追加します。

list.add(emailAddress);  //since emailAddress will be the email of the supervisor
于 2013-07-08T10:05:12.100 に答える