@Override
 public List<StateInfo> performSearch(
     LookupForm lookupForm, Map<String, String> searchCriteria, boolean bounded) {
   QueryByCriteria.Builder qBuilder = QueryByCriteria.Builder.create();
   List<Predicate> pList = new ArrayList<Predicate>();
   // Code Changed for JIRA-8997 - SONAR Critical issues - Performance - Inefficient use of keySet
   // iterator instead of entrySet iterator
   for (Map.Entry<String, String> entry : searchCriteria.entrySet()) {
     String fieldName = entry.getKey();
     String value = entry.getValue();
     if (value != null && !value.isEmpty()) {
       if (fieldName.equals("maxResultsToReturn")) {
         qBuilder.setMaxResults(Integer.parseInt(value));
         continue;
       }
       pList.add(PredicateFactory.equal(fieldName, value));
     }
   }
   if (!pList.isEmpty()) {
     qBuilder.setPredicates(PredicateFactory.and(pList.toArray(new Predicate[pList.size()])));
   }
   try {
     return this.getStateService().searchForStates(qBuilder.build(), getContextInfo());
   } catch (Exception ex) {
     throw new RuntimeException(ex);
   }
 }
 @Override
 protected List<Predicate> getPredicates(ProposalBudgetForm model) {
   String budgetCategoryTypeCode =
       model.getAddProjectBudgetLineItemHelper().getBudgetCategoryTypeCode();
   List<Predicate> predicates = new ArrayList<>();
   if (StringUtils.isNotEmpty(budgetCategoryTypeCode)) {
     predicates.add(PredicateFactory.equal(BUDGET_CATEGORY_TYPE_CODE, budgetCategoryTypeCode));
   } else {
     predicates.add(
         PredicateFactory.notEqual(
             BUDGET_CATEGORY_TYPE_CODE, getPersonnelBudgetCategoryTypeCode()));
   }
   return predicates;
 }
  protected static List<String> getOptionKeys(
      CourseOfferingCreateWrapper createWrapper, CourseOfferingInfo existingCO) {

    List<String> optionKeys =
        getDefaultOptionKeysService().getDefaultOptionKeysForCopySingleCourseOffering();

    if (createWrapper.isExcludeInstructorInformation()) {
      optionKeys.add(CourseOfferingSetServiceConstants.NO_INSTRUCTORS_OPTION_KEY);
    }

    if (createWrapper.isExcludeSchedulingInformation()) {
      optionKeys.add(CourseOfferingSetServiceConstants.NO_SCHEDULE_OPTION_KEY);
    }

    if (createWrapper.isExcludeCancelledActivityOfferings()) {
      optionKeys.add(CourseOfferingSetServiceConstants.IGNORE_CANCELLED_AO_OPTION_KEY);
    }

    ContextInfo contextInfo = ContextUtils.createDefaultContextInfo();

    try {
      // if source term differs from target term determine if add suffix or not
      if (StringUtils.equals(existingCO.getTermId(), createWrapper.getTerm().getId())) {
        optionKeys.add(CourseOfferingServiceConstants.APPEND_COURSE_OFFERING_IN_SUFFIX_OPTION_KEY);
      } else {
        QueryByCriteria.Builder qbcBuilder = QueryByCriteria.Builder.create();
        qbcBuilder.setPredicates(
            PredicateFactory.and(
                PredicateFactory.like(
                    "courseOfferingCode", existingCO.getCourseOfferingCode() + "%"),
                PredicateFactory.equalIgnoreCase("atpId", createWrapper.getTerm().getId())));
        QueryByCriteria criteria = qbcBuilder.build();
        List<String> courseOfferingIds =
            CourseOfferingManagementUtil.getCourseOfferingService()
                .searchForCourseOfferingIds(criteria, contextInfo);

        if (courseOfferingIds.size() > 0) {
          optionKeys.add(
              CourseOfferingServiceConstants.APPEND_COURSE_OFFERING_IN_SUFFIX_OPTION_KEY);
        }
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }

    //  According to Jira 4353 copy the title from CO instead of CLU. So set the property not to
    // copy from CLU
    optionKeys.add(CourseOfferingSetServiceConstants.NOT_COURSE_TITLE_OPTION_KEY);
    return optionKeys;
  }
  protected PropAwardPersonRoleServiceImpl getPropAwardPersonRoleService() {
    final PropAwardPersonRoleServiceImpl roleService = new PropAwardPersonRoleServiceImpl();
    final DataObjectService dataObjectService = context.mock(DataObjectService.class);
    final ParameterService parameterService = context.mock(ParameterService.class);
    final SponsorHierarchyService hierarchyService = context.mock(SponsorHierarchyService.class);

    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findMatching(
                    PropAwardPersonRole.class,
                    QueryByCriteria.Builder.forAttribute(
                            "sponsorHierarchyName",
                            PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY)
                        .build());
            will(returnValue(roleListBuilder.build()));
          }
        });

    final QueryByCriteria.Builder criteriaCoInvestigator1 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.COI_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole roleCoInvestigator1 =
        createTestRole(
            3L, ContactRole.COI_CODE, PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaCoInvestigator1.build());
            will(returnValue(roleCoInvestigator1));
          }
        });

    final QueryByCriteria.Builder criteriaCoInvestigator2 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.COI_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole roleCoInvestigator2 =
        createTestRole(
            3L, ContactRole.COI_CODE, PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaCoInvestigator2.build());
            will(returnValue(roleCoInvestigator2));
          }
        });

    final QueryByCriteria.Builder criteriaKeyPerson1 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.KEY_PERSON_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole roleKeyPerson1 =
        createTestRole(
            3L,
            ContactRole.KEY_PERSON_CODE,
            PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaKeyPerson1.build());
            will(returnValue(roleKeyPerson1));
          }
        });

    final QueryByCriteria.Builder criteriaKeyPerson2 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.KEY_PERSON_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole roleKeyPerson2 =
        createTestRole(
            3L,
            ContactRole.KEY_PERSON_CODE,
            PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaKeyPerson2.build());
            will(returnValue(roleKeyPerson2));
          }
        });

    final QueryByCriteria.Builder criteriaKeyPerson3 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.KEY_PERSON_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole roleKeyPerson3 =
        createTestRole(
            3L,
            ContactRole.KEY_PERSON_CODE,
            PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaKeyPerson3.build());
            will(returnValue(roleKeyPerson3));
          }
        });

    final QueryByCriteria.Builder criteriaKeyPerson4 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.KEY_PERSON_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole roleKeyPerson4 =
        createTestRole(
            3L,
            ContactRole.KEY_PERSON_CODE,
            PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaKeyPerson4.build());
            will(returnValue(roleKeyPerson4));
          }
        });

    final QueryByCriteria.Builder criteriaKeyPerson5 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.KEY_PERSON_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole roleKeyPerson5 =
        createTestRole(
            3L,
            ContactRole.KEY_PERSON_CODE,
            PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaKeyPerson5.build());
            will(returnValue(roleKeyPerson5));
          }
        });

    final QueryByCriteria.Builder criteriaPrincipalInvestigator1 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.PI_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole rolePrincipalInvestigator1 =
        createTestRole(
            3L, ContactRole.PI_CODE, PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaPrincipalInvestigator1.build());
            will(returnValue(rolePrincipalInvestigator1));
          }
        });

    final QueryByCriteria.Builder criteriaPrincipalInvestigator2 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.PI_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole rolePrincipalInvestigator2 =
        createTestRole(
            3L, ContactRole.PI_CODE, PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaPrincipalInvestigator2.build());
            will(returnValue(rolePrincipalInvestigator2));
          }
        });

    final QueryByCriteria.Builder criteriaPrincipalInvestigator3 =
        QueryByCriteria.Builder.create()
            .setPredicates(
                PredicateFactory.equal("code", ContactRole.PI_CODE),
                PredicateFactory.equal(
                    "sponsorHierarchyName",
                    PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY));
    final PropAwardPersonRole rolePrincipalInvestigator3 =
        createTestRole(
            3L, ContactRole.PI_CODE, PropAwardPersonRoleServiceImpl.NIH_MULTIPLE_PI_HIERARCHY);
    context.checking(
        new Expectations() {
          {
            one(parameterService)
                .getParameterValueAsBoolean(
                    Constants.MODULE_NAMESPACE_PROPOSAL_DEVELOPMENT,
                    Constants.PARAMETER_COMPONENT_DOCUMENT,
                    PropAwardPersonRoleServiceImpl.ALL_SPONSOR_HIERARCHY_NIH_MULTI_PI);
            will(returnValue(true));
            one(dataObjectService)
                .findUnique(PropAwardPersonRole.class, criteriaPrincipalInvestigator3.build());
            will(returnValue(rolePrincipalInvestigator3));
          }
        });

    roleService.setDataObjectService(dataObjectService);
    roleService.setSponsorHierarchyService(hierarchyService);
    roleService.setParameterService(parameterService);
    return roleService;
  }