public boolean isRequestedAppearanceDateBetweenDates(Calendar startDate, Calendar endDate) {

    if (requestedAppearanceDate == null || (startDate == null && endDate == null)) {
      return false;
    }

    Calendar requestedAppearanceCalendar =
        DateUtils.clearTimeFromCalendar(DateUtils.toCalendar(requestedAppearanceDate));

    if (endDate != null) {
      return !requestedAppearanceCalendar.before(startDate)
          && !endDate.before(requestedAppearanceCalendar);
    }

    return startDate.equals(requestedAppearanceCalendar);
  }
  public void findScheduledContentObjectsForContentArea_UIAction(Topic contentArea) {

    if (contentArea == null) {
      selectedContentArea = null;
      requestedAppearanceDate = null;
      return;
    }

    // reset search criteria to begin a new search
    contentObjectCriteria = null;
    contentObjectCriteria = CmsCriteriaFactory.newContentObjectCriteria();
    // contentObjectCriteria.getRenderProperties().renderValuesForLocale(JSFUtilities.getLocaleAsString());

    try {
      selectedContentArea = contentArea;

      /*
       * we are looking only for content objects scheduled for requested date
       */
      Calendar requestedAppearanceCalendar =
          DateUtils.clearTimeFromCalendar(DateUtils.toCalendar(requestedAppearanceDate));

      if (requestedAppearanceCalendar == null) {
        requestedAppearanceCalendar = DateUtils.clearTimeFromCalendar(Calendar.getInstance());
        requestedAppearanceDate = requestedAppearanceCalendar.getTime();
      }

      // This criteria looks for all content objects which have an ASPECT or a predefined complex
      // type named 'scheduledContentAreaListType'
      // In case a user has defined a complex property of type 'scheduledContentAreaListType' but
      // provided a name other than 'scheduledContentAreaListType'
      // e.g. <xs:element name="scheduledContentAreas"
      // type="scheduledContentAreaListType:scheduledContentAreaListType"/>
      // this property will not participate in the results of the query.

      // we are searching only for content objects which have a complex property named
      // 'scheduledContentAreaListType'
      //
      // contentObjectCriteria.addTopicIdEqualsCriterion(contentArea.getId(),
      // contentArea.getTaxonomy().getName());
      // contentObjectCriteria.addCriterion(CriterionFactory.equals("scheduledContentAreaListType.scheduledContentArea.contentArea", contentArea.getId()));

      // appearanceEndDate is not null AND appearanceEndDate >= requestedDate AND
      // appearanceStartDate <= requestedDate
      // Criterion appearanceEndDateExistsCriterion =
      // CriterionFactory.isNotNull("scheduledContentAreaListType.scheduledContentArea.appearanceEndDate");
      // Criterion appearanceStartDateLessEqualsThanRequestedDateCriterion =
      // CriterionFactory.lessThanOrEquals("scheduledContentAreaListType.scheduledContentArea.appearanceStartDate", requestedAppearanceCalendar);
      // Criterion appearanceEndDateGreaterEqualsThanRequestedDateCriterion =
      // CriterionFactory.greaterThanOrEquals("scheduledContentAreaListType.scheduledContentArea.appearanceEndDate", requestedAppearanceCalendar);
      // Criterion requestedDateBetweenStartAndEndAppearanceDateCriterion =
      // CriterionFactory.and(appearanceStartDateLessEqualsThanRequestedDateCriterion,
      // appearanceEndDateGreaterEqualsThanRequestedDateCriterion);

      // Criterion oneCondition = CriterionFactory.and(appearanceEndDateExistsCriterion,
      // requestedDateBetweenStartAndEndAppearanceDateCriterion);

      // appearanceEndDate is null AND appearanceStartDate == requestedDate
      // Criterion appearanceEndDateDoesNotExistCriterion =
      // CriterionFactory.isNull("scheduledContentAreaListType.scheduledContentArea.appearanceEndDate");
      // Criterion appearanceStartDateEqualsRequestedDateCriterion =
      // CriterionFactory.equals("scheduledContentAreaListType.scheduledContentArea.appearanceStartDate", requestedAppearanceCalendar);

      // Criterion secondCondition = CriterionFactory.and(appearanceEndDateDoesNotExistCriterion,
      // appearanceStartDateEqualsRequestedDateCriterion);

      // contentObjectCriteria.addCriterion(CriterionFactory.or(oneCondition, secondCondition));

      // contentObjectCriteria.addOrderProperty("scheduledContentAreaListType.scheduledContentArea.appearanceDate", Order.descending);

      // Call parent to execute query and create paged list data model
      // searchForContentObjectWithPagedResults();

      /*
      * Unfortunately the above criteria will not bring the desired results due to the nature of the XPATH query
      * that is created by the criteria :
      *
      * //element ( *,bccms:structuredContentObject )  [
      	(   scheduledContentAreaListType/scheduledContentArea/@contentArea = 'THE_SELECTED_CONTENT_AREA_ID'   and
      	  (
      		(  scheduledContentAreaListType/scheduledContentArea/@appearanceEndDate  and
      			(   scheduledContentAreaListType/scheduledContentArea/@appearanceStartDate <= xs:dateTime('REQUESTED_DATE')
      			   and   scheduledContentAreaListType/scheduledContentArea/@appearanceEndDate >= xs:dateTime('REQUESTED_DATE')
      			)
      	    )
      	    or
      	    (  not(scheduledContentAreaListType/scheduledContentArea/@appearanceEndDate)
      	       and   scheduledContentAreaListType/scheduledContentArea/@appearanceStartDate = xs:dateTime('2008-10-08T00:00:00.000+03:00')
      	    )
      	  )
      	)
      	]
      *
      * With the above query Astroboa repository will match any content object which has a complex property scheduledContentAreaListType/scheduledContentArea
      * whose simple property @contentArea refers to the selected content area AND
      *
      * (
      *  (	this contentObject has a complex property scheduledContentAreaListType/scheduledContentArea whose simple property @appearanceEndDate exists AND
      *   this contentObject has a complex property scheduledContentAreaListType/scheduledContentArea whose simple property @appearanceStartDate is <= requestedDate AND
      *   this contentObject has a complex property scheduledContentAreaListType/scheduledContentArea whose simple property @appearanceEndDate is >= requestedDate
      *   )
      *   OR
      *   (
      *   	this contentObject has a complex property scheduledContentAreaListType/scheduledContentArea whose simple property @appearanceEndDate does not exists AND
      *   	this contentObject has a complex property scheduledContentAreaListType/scheduledContentArea whose simple property @appearanceStartDate == requestedDate
      *   )
      * )
      *
      * Notice that the above query does not declare that the SAME scheduledContentAreaListType/scheduledContentArea must match provided criteria.
      *
      * The correct query is
      * //element ( *,bccms:structuredContentObject )/scheduledContentAreaListType/scheduledContentArea  [
      	 @contentArea = 'THE_SELECTED_CONTENT_AREA_ID'   and
      	  (
      	     (   @appearanceEndDate  and  (   @appearanceStartDate <= xs:dateTime('REQUESTED_DATE')
      	                               and   @appearanceEndDate >= xs:dateTime('REQUESTED_DATE')
      								  )
      	     )
      	   or  (  not(@appearanceEndDate)  and @appearanceStartDate = xs:dateTime('REQUESTED_DATE') )
      	  )
      	]

               * which is cannot be created using Astroboa Criteria API
      */
      String query =
          "//element ( *,bccms:structuredContentObject )/scheduledContentAreaListType/scheduledContentArea  ["
              + " @contentArea = '"
              + contentArea.getId()
              + "'   and "
              + "  ( "
              + "     (   @appearanceEndDate  and  (   @appearanceStartDate <= xs:dateTime('"
              + XPathUtils.formatForQuery(requestedAppearanceCalendar)
              + "')"
              + "                               and   @appearanceEndDate >= xs:dateTime('"
              + XPathUtils.formatForQuery(requestedAppearanceCalendar)
              + "')"
              + ")"
              + "     ) "
              + "   or  (  not(@appearanceEndDate)  and @appearanceStartDate = xs:dateTime('"
              + XPathUtils.formatForQuery(requestedAppearanceCalendar)
              + "') )"
              + "  )"
              + "] order by @appearanceStartDate asc, @order asc";

      searchForContentObjectWithPagedResultsUsingQuery(query);

    } catch (Exception e) {
      logger.error("Error while loading content objects ", e);
      JSFUtilities.addMessage(
          null,
          "object.list.message.contentObjectRetrievalError",
          null,
          FacesMessage.SEVERITY_ERROR);
    }
  }