code: private void readCalendar(net.sf.mpxj.planner.schema.Calendar plannerCalendar, ProjectCalendar parentMpxjCalendar) throws MPXJException
     {
        //
        // Create a calendar instance
        //
        ProjectCalendar mpxjCalendar = m_projectFile.addCalendar();
  
        //
        // Populate basic details
        //
        mpxjCalendar.setUniqueID(getInteger(plannerCalendar.getId()));
        mpxjCalendar.setName(plannerCalendar.getName());
        mpxjCalendar.setParent(parentMpxjCalendar);
  
        //
        // Set working and non working days
        //
        DefaultWeek dw = plannerCalendar.getDefaultWeek();
        setWorkingDay(mpxjCalendar, Day.MONDAY, dw.getMon());
        setWorkingDay(mpxjCalendar, Day.TUESDAY, dw.getTue());
        setWorkingDay(mpxjCalendar, Day.WEDNESDAY, dw.getWed());
        setWorkingDay(mpxjCalendar, Day.THURSDAY, dw.getThu());
        setWorkingDay(mpxjCalendar, Day.FRIDAY, dw.getFri());
        setWorkingDay(mpxjCalendar, Day.SATURDAY, dw.getSat());
        setWorkingDay(mpxjCalendar, Day.SUNDAY, dw.getSun());
  
        //
        // Set working hours
        //
        processWorkingHours(mpxjCalendar, plannerCalendar);
  
        //
        // Process exception days
        //
        processExceptionDays(mpxjCalendar, plannerCalendar);
  
        m_eventManager.fireCalendarReadEvent(mpxjCalendar);
  
        //
        // Process any derived calendars
        //
        List<net.sf.mpxj.planner.schema.Calendar> calendarList = plannerCalendar.getCalendar();
        for (net.sf.mpxj.planner.schema.Calendar cal : calendarList)
        {
           readCalendar(cal, mpxjCalendar);
        }
     }
docs: This method extracts data for a single calendar from a Planner file.
  
  @param plannerCalendar Calendar data
  @param parentMpxjCalendar parent of derived calendar