/**
  * @return the calendar
  * @throws ParserException where calendar parsing fails
  * @throws IOException where a communication error occurs
  */
 public final Calendar getCalendar() throws IOException, ParserException {
   if (calendar == null) {
     CalendarBuilder builder = new CalendarBuilder();
     //            calendar = builder.build(new
     // ByteArrayInputStream(file.getDataProvider().getBytes()));
     calendar = builder.build(file.getDataProvider().getInputStream());
   }
   return calendar;
 }
  /** @param calendar the calendar to set */
  public final void setCalendar(final Calendar calendar) {
    this.calendar = calendar;

    try {
      Uid uidProp = Calendars.getUid(calendar);
      this.uid = uidProp.getValue();
      setName(uidProp.getValue());
    } catch (ConstraintViolationException e) {
      LOG.error("Invalid UID", e);
      setName("calendar");
    }

    file = new JcrFile();
    file.setName("data");
    file.setDataProvider(new JcrDataProviderImpl(calendar.toString().getBytes()));
    //        file.setMimeType(MediaType.ICALENDAR_2_0.getContentType());
    file.setMimeType(Calendars.getContentType(calendar, null));
    file.setLastModified(java.util.Calendar.getInstance());

    for (Object component : calendar.getComponents()) {

      // save first available summary..
      if (summary == null) {
        Summary summaryProp = (Summary) ((Component) component).getProperty(Property.SUMMARY);
        if (summaryProp != null) {
          this.summary = summaryProp.getValue();
        }
      }

      // save first available description..
      if (description == null) {
        Description descriptionProp =
            (Description) ((Component) component).getProperty(Property.DESCRIPTION);
        if (descriptionProp != null) {
          description = new JcrFile();
          description.setName("text");
          description.setMimeType("text/plain");
          description.setDataProvider(
              new JcrDataProviderImpl(descriptionProp.getValue().getBytes()));
          description.setLastModified(java.util.Calendar.getInstance());
        }
      }

      // save attachments..
      attachments.clear();
      PropertyList attachments = ((Component) component).getProperties(Property.ATTACH);
      for (Object attach : attachments) {
        try {
          JcrFile attachment = new JcrFile();
          attachment.setName("attachment");
          if (Value.BINARY.equals(((Property) attach).getParameter(Parameter.VALUE))) {
            attachment.setDataProvider(new JcrDataProviderImpl(((Attach) attach).getBinary()));
            FmtType contentType = (FmtType) ((Property) attach).getParameter(Parameter.FMTTYPE);
            if (contentType != null) {
              attachment.setMimeType(contentType.getValue());
            }
          } else {
            ByteArrayOutputStream aout = new ByteArrayOutputStream();
            IOUtils.copy(((Attach) attach).getUri().toURL().openStream(), aout);
            attachment.setDataProvider(new JcrDataProviderImpl(aout.toByteArray()));
          }
          attachment.setLastModified(java.util.Calendar.getInstance());
          this.attachments.add(attachment);
        } catch (Exception e) {
          LOG.error("Error saving attachment", e);
        }
      }
    }
  }