public void testICalendarAttribute() throws Exception {
    User user = getUser(userDao, "testuser");
    CollectionItem root = (CollectionItem) contentDao.getRootItem(user);

    ContentItem item = generateTestContent();

    ICalendarAttribute icalAttr = new HibICalendarAttribute();
    icalAttr.setQName(new HibQName("icalattribute"));
    icalAttr.setValue(helper.getInputStream("vjournal.ics"));
    item.addAttribute(icalAttr);

    ContentItem newItem = contentDao.createContent(root, item);

    clearSession();

    ContentItem queryItem = contentDao.findContentByUid(newItem.getUid());

    Attribute attr = queryItem.getAttribute(new HibQName("icalattribute"));
    Assert.assertNotNull(attr);
    Assert.assertTrue(attr instanceof ICalendarAttribute);

    net.fortuna.ical4j.model.Calendar calendar =
        (net.fortuna.ical4j.model.Calendar) attr.getValue();
    Assert.assertNotNull(calendar);

    net.fortuna.ical4j.model.Calendar expected =
        CalendarUtils.parseCalendar(helper.getInputStream("vjournal.ics"));

    Assert.assertEquals(expected.toString(), calendar.toString());

    calendar.getProperties().add(new ProdId("blah"));

    contentDao.updateContent(queryItem);

    clearSession();

    queryItem = contentDao.findContentByUid(newItem.getUid());

    ICalendarAttribute ica =
        (ICalendarAttribute) queryItem.getAttribute(new HibQName("icalattribute"));
    Assert.assertFalse(expected.toString().equals(ica.getValue().toString()));
  }
  public void testTimestampAttribute() throws Exception {
    User user = getUser(userDao, "testuser");
    CollectionItem root = (CollectionItem) contentDao.getRootItem(user);

    ContentItem item = generateTestContent();
    Date dateVal = new Date();
    TimestampAttribute tsAttr =
        new HibTimestampAttribute(new HibQName("timestampattribute"), dateVal);
    item.addAttribute(tsAttr);

    ContentItem newItem = contentDao.createContent(root, item);

    clearSession();

    ContentItem queryItem = contentDao.findContentByUid(newItem.getUid());

    Attribute attr = queryItem.getAttribute(new HibQName("timestampattribute"));
    Assert.assertNotNull(attr);
    Assert.assertTrue(attr instanceof TimestampAttribute);

    Date val = (Date) attr.getValue();
    Assert.assertTrue(dateVal.equals(val));

    dateVal.setTime(dateVal.getTime() + 101);
    attr.setValue(dateVal);

    contentDao.updateContent(queryItem);

    clearSession();

    queryItem = contentDao.findContentByUid(newItem.getUid());
    Attribute queryAttr = queryItem.getAttribute(new HibQName("timestampattribute"));
    Assert.assertNotNull(queryAttr);
    Assert.assertTrue(queryAttr instanceof TimestampAttribute);

    val = (Date) queryAttr.getValue();
    Assert.assertTrue(dateVal.equals(val));
  }
  public void testCalendarAttribute() throws Exception {
    User user = getUser(userDao, "testuser");
    CollectionItem root = (CollectionItem) contentDao.getRootItem(user);

    ContentItem item = generateTestContent();

    CalendarAttribute calAttr =
        new HibCalendarAttribute(new HibQName("calendarattribute"), "2002-10-10T00:00:00+05:00");
    item.addAttribute(calAttr);

    ContentItem newItem = contentDao.createContent(root, item);

    clearSession();

    ContentItem queryItem = contentDao.findContentByUid(newItem.getUid());

    Attribute attr = queryItem.getAttribute(new HibQName("calendarattribute"));
    Assert.assertNotNull(attr);
    Assert.assertTrue(attr instanceof CalendarAttribute);

    Calendar cal = (Calendar) attr.getValue();
    Assert.assertEquals(cal.getTimeZone().getID(), "GMT+05:00");
    Assert.assertTrue(cal.equals(calAttr.getValue()));

    attr.setValue("2003-10-10T00:00:00+02:00");

    contentDao.updateContent(queryItem);

    clearSession();

    queryItem = contentDao.findContentByUid(newItem.getUid());
    Attribute queryAttr = queryItem.getAttribute(new HibQName("calendarattribute"));
    Assert.assertNotNull(queryAttr);
    Assert.assertTrue(queryAttr instanceof CalendarAttribute);

    cal = (Calendar) queryAttr.getValue();
    Assert.assertEquals(cal.getTimeZone().getID(), "GMT+02:00");
    Assert.assertTrue(cal.equals(attr.getValue()));
  }
  public void testXmlAttribute() throws Exception {
    User user = getUser(userDao, "testuser");
    CollectionItem root = (CollectionItem) contentDao.getRootItem(user);

    ContentItem item = generateTestContent();

    org.w3c.dom.Element testElement = createTestElement();
    org.w3c.dom.Element testElement2 = createTestElement();

    testElement2.setAttribute("foo", "bar");

    Assert.assertFalse(testElement.isEqualNode(testElement2));

    XmlAttribute xmlAttr = new HibXmlAttribute(new HibQName("xmlattribute"), testElement);
    item.addAttribute(xmlAttr);

    ContentItem newItem = contentDao.createContent(root, item);

    clearSession();

    ContentItem queryItem = contentDao.findContentByUid(newItem.getUid());

    Attribute attr = queryItem.getAttribute(new HibQName("xmlattribute"));
    Assert.assertNotNull(attr);
    Assert.assertTrue(attr instanceof XmlAttribute);

    org.w3c.dom.Element element = (org.w3c.dom.Element) attr.getValue();

    Assert.assertEquals(DomWriter.write(testElement), DomWriter.write(element));

    Date modifyDate = attr.getModifiedDate();

    // Sleep a couple millis to make sure modifyDate doesn't change
    Thread.sleep(2);

    contentDao.updateContent(queryItem);

    clearSession();

    queryItem = contentDao.findContentByUid(newItem.getUid());

    attr = queryItem.getAttribute(new HibQName("xmlattribute"));

    // Attribute shouldn't have been updated
    Assert.assertEquals(modifyDate, attr.getModifiedDate());

    attr.setValue(testElement2);

    // Sleep a couple millis to make sure modifyDate doesn't change
    Thread.sleep(2);
    modifyDate = attr.getModifiedDate();

    contentDao.updateContent(queryItem);

    clearSession();

    queryItem = contentDao.findContentByUid(newItem.getUid());

    attr = queryItem.getAttribute(new HibQName("xmlattribute"));
    Assert.assertNotNull(attr);
    Assert.assertTrue(attr instanceof XmlAttribute);
    // Attribute should have been updated
    Assert.assertTrue(modifyDate.before(attr.getModifiedDate()));

    element = (org.w3c.dom.Element) attr.getValue();

    Assert.assertEquals(DomWriter.write(testElement2), DomWriter.write(element));
  }
  public void testContentAttributes() throws Exception {
    User user = getUser(userDao, "testuser");
    CollectionItem root = (CollectionItem) contentDao.getRootItem(user);

    ContentItem item = generateTestContent();
    item.addIntegerAttribute("intattribute", new Long(22));
    item.addBooleanAttribute("booleanattribute", Boolean.TRUE);

    DecimalAttribute decAttr =
        new HibDecimalAttribute(new HibQName("decimalattribute"), new BigDecimal("1.234567"));
    item.addAttribute(decAttr);

    // TODO: figure out db date type is handled because i'm seeing
    // issues with accuracy
    // item.addAttribute(new DateAttribute("dateattribute", new Date()));

    HashSet<String> values = new HashSet<String>();
    values.add("value1");
    values.add("value2");
    item.addMultiValueStringAttribute("multistringattribute", values);

    HashMap<String, String> dictionary = new HashMap<String, String>();
    dictionary.put("key1", "value1");
    dictionary.put("key2", "value2");
    item.addDictionaryAttribute("dictionaryattribute", dictionary);

    ContentItem newItem = contentDao.createContent(root, item);

    Assert.assertTrue(getHibItem(newItem).getId() > -1);
    Assert.assertTrue(newItem.getUid() != null);

    clearSession();

    ContentItem queryItem = contentDao.findContentByUid(newItem.getUid());

    Attribute attr = queryItem.getAttribute(new HibQName("decimalattribute"));
    Assert.assertNotNull(attr);
    Assert.assertTrue(attr instanceof DecimalAttribute);
    Assert.assertEquals(attr.getValue().toString(), "1.234567");

    Set<String> querySet = (Set<String>) queryItem.getAttributeValue("multistringattribute");
    Assert.assertTrue(querySet.contains("value1"));
    Assert.assertTrue(querySet.contains("value2"));

    Map<String, String> queryDictionary =
        (Map<String, String>) queryItem.getAttributeValue("dictionaryattribute");
    Assert.assertEquals("value1", queryDictionary.get("key1"));
    Assert.assertEquals("value2", queryDictionary.get("key2"));

    Attribute custom = queryItem.getAttribute("customattribute");
    Assert.assertEquals("customattributevalue", custom.getValue());

    helper.verifyItem(newItem, queryItem);

    // set attribute value to null
    custom.setValue(null);

    querySet.add("value3");
    queryDictionary.put("key3", "value3");

    queryItem.removeAttribute("intattribute");

    contentDao.updateContent(queryItem);

    clearSession();

    queryItem = contentDao.findContentByUid(newItem.getUid());
    querySet = (Set) queryItem.getAttributeValue("multistringattribute");
    queryDictionary = (Map) queryItem.getAttributeValue("dictionaryattribute");
    Attribute queryAttribute = queryItem.getAttribute("customattribute");

    Assert.assertTrue(querySet.contains("value3"));
    Assert.assertEquals("value3", queryDictionary.get("key3"));
    Assert.assertNotNull(queryAttribute);
    Assert.assertNull(queryAttribute.getValue());
    Assert.assertNull(queryItem.getAttribute("intattribute"));
  }