/** * test GenerateQuery * TODO this class will never fail test: you've to * check resulting output visually and verify if * it's the expected result */ package org.osaf.caldav4j.util; import static org.junit.Assert.assertTrue; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import net.fortuna.ical4j.model.Component; import net.fortuna.ical4j.model.DateTime; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.osaf.caldav4j.BaseTestCase; import org.osaf.caldav4j.CalDAVConstants; import org.osaf.caldav4j.exceptions.CalDAV4JException; import org.osaf.caldav4j.exceptions.DOMValidationException; import org.osaf.caldav4j.methods.PutGetTest; import org.osaf.caldav4j.model.request.CalendarData; import org.osaf.caldav4j.model.request.CalendarQuery; import org.osaf.caldav4j.model.request.Comp; import org.osaf.caldav4j.model.request.ParamFilter; import org.osaf.caldav4j.model.request.TextMatch; import org.w3c.dom.Document; public class GenerateQueryTest extends BaseTestCase { private static final Log log = LogFactory.getLog(PutGetTest.class); @Before @Override public void setUp() throws Exception {} @After @Override public void tearDown() throws Exception {} private String printQuery(CalendarQuery query) { try { query.validate(); Document doc = query.createNewDocument(XMLUtils .getDOMImplementation()); return XMLUtils.toPrettyXML(doc); } catch (DOMValidationException domve) { log.error("Error trying to create DOM from CalDAVReportRequest: ", domve); throw new RuntimeException(domve); } catch (Exception e) { e.printStackTrace(); assertTrue(false); } return null; } /** * basic VEVENT CompFilter */ @Test public void testFilter_VEVENT() { try { log.info("Filter: VEVENT"); GenerateQuery gq = new GenerateQuery(); gq.setFilter("VEVENT"); log.info(printQuery(gq.generate())); // and now test the constructor gq = new GenerateQuery(null,Component.VEVENT); log.info(printQuery(gq.generate())); } catch (CalDAV4JException e) { e.printStackTrace(); assertTrue(false); } } @Test public void testComp_VEVENT() { try { log.info("Comp: VEVENT"); GenerateQuery gq = new GenerateQuery(); gq.setComponent(Component.VEVENT); log.info("Set component:\n" + printQuery(gq.generate())); // and now test the constructor final String VEVENT_PROPERTIES_BY_TIMERANGE_F = "VEVENT [20060104T000000Z;20060105T000000Z]"; final String VEVENT_PROPERTIES_BY_TIMERANGE_C = "VEVENT : SUMMARY,UID,DTSTART,DTEND,RRULE,RDATE,DURATION,EXRULE,EXDATE,RECURRENCE-ID"; gq = new GenerateQuery(VEVENT_PROPERTIES_BY_TIMERANGE_C, VEVENT_PROPERTIES_BY_TIMERANGE_F); // print the query generated by the constructor log.info("Constructor:\n" + printQuery(gq.generate())); // save the query CalendarQuery query = gq.generate(); // modify to conform RFC example 7.8.1. // Example: Partial Retrieval of Events by Time Range Comp compVtimezone = new Comp("C"); compVtimezone.setName(Component.VTIMEZONE); query.getCalendarDataProp().getComp().getComps().add(compVtimezone); log.info("no calendar-data:\n" + printQuery(query)); // now remove calendar data gq.setNoCalendarData(true); log.info("no calendar-data:\n" + printQuery(gq.generate())); // and limit recurrence set gq.setNoCalendarData(false); gq.setRecurrenceSet("20060101T170000Z","20060105T240000Z", CalendarData.EXPAND); // gq.setRecurrenceSet("20060104T000000Z","20060105T000000Z"); log.info("limit-recurrence-set:\n" + printQuery(gq.generate())); } catch (CalDAV4JException e) { e.printStackTrace(); assertTrue(false); } } @Test public void testDateTime() throws ParseException { String dates[] = new String[] { "20060101T170000Z","20060105T230000Z" }; for (String d : dates) { log.info(new DateTime(d)); } } // Creating Calendar-Query like the RFC's one @Test public void testQuery_TODO() { try { List<String> a = new ArrayList<String> (); a.add("STATUS!=CANCELLED"); a.add("COMPLETED==UNDEF"); a.add("DTSTART==[;20080810]"); GenerateQuery gq = new GenerateQuery(); gq.setFilter("VTODO", a); log.info(printQuery(gq.generate())); // and now the constructor String fquery = "VTODO : STATUS!=CANCELLED , COMPLETED==UNDEF , DTSTART==[;20080810]"; gq = new GenerateQuery(null, fquery); log.info(printQuery(gq.generate())); // and now the constru ctor fquery = "VTODO [20060106T100000Z;20060106T100000Z]: STATUS!=CANCELLED , COMPLETED==UNDEF , DTSTART==[;20080810]"; gq = new GenerateQuery(null, fquery); log.info(printQuery(gq.generate())); } catch (CalDAV4JException e) { e.printStackTrace(); assertTrue(false); } } @Test public void testQuery_ATTENDEE() { try { log.info("VEVENT + ATTENDEE:"); List<String> a = new ArrayList<String> (); a.add("ATTENDEE==mailto:lisa@example.com"); GenerateQuery gq = new GenerateQuery(); gq.setFilter("VEVENT", a); log.info("setFilter()"+printQuery(gq.generate())); gq = new GenerateQuery(null,"VEVENT : ATTENDEE==mailto:lisa@example.com"); log.info("Constructor:"+printQuery(gq.generate())); } catch (CalDAV4JException e) { e.printStackTrace(); assertTrue(false); } } /** * queries for nested components: there's no syntax for this, * so you have to use a bit of magic * VTODO : VALARM */ @Test public void testQuery_VALARM() { try { CalendarQuery compoundQuery = null; // create the external comp-filter GenerateQuery gq = new GenerateQuery(); gq.setFilter("VTODO", null); compoundQuery = gq.generate(); log.info(printQuery(gq.generate())); // add the inner filter (VALARM in time-range) to the VTODO one gq = new GenerateQuery(null, "VALARM [20060106T100000Z;20060106T170000Z]"); compoundQuery.getCompFilter().getCompFilters().get(0).addCompFilter( gq.generate().getCompFilter().getCompFilters().get(0) ); log.info(printQuery(compoundQuery)); } catch (CalDAV4JException e) { e.printStackTrace(); assertTrue(false); } } @Test public void testFilterProperties() { try { List<String> a = new ArrayList<String> (); a.add("UID==DSDDAS123-D32423-42332-dasdsafwe"); a.add("X-PLUTO-SPADA!=fsdfsdfds"); a.add("SUMMARY!=CDSDafsd"); a.add("DESCRIPTION==UNDEF"); // a.add("DTSTART==[13082008,14082008]"); GenerateQuery gq = new GenerateQuery(); gq.setFilter("VEVENT", a); log.info(printQuery(gq.generate())); String fquery = "VEVENT:UID==DSDDAS123-D32423-42332-dasdsafwe" + ",X-PLUTO-SPADA!=fsdfsdfds" + ",SUMMARY!=CDSDafsd" + ",DESCRIPTION==UNDEF"; gq = new GenerateQuery(null, fquery); log.info(printQuery(gq.generate())); } catch (CalDAV4JException e) { e.printStackTrace(); assertTrue(false); } } /** * @see http://tools.ietf.org/html/rfc4791#section-7.8.7 */ @Test public void testParamFilterProperties() { try { GenerateQuery gq = new GenerateQuery(); String fquery = "VEVENT : ATTENDEE==mailto:lisa@example.com"; gq = new GenerateQuery(null, fquery); CalendarQuery query = gq.generate(); log.info(printQuery(query)); /* * compose * <param-filter name="PARTSTAT"><text-match>NEEDS-ACTION</text-match></param-filter> */ ParamFilter paramSentBy = new ParamFilter(CalDAVConstants.NS_QUAL_CALDAV); paramSentBy.setName("PARTSTAT"); paramSentBy.setTextMatch(new TextMatch(CalDAVConstants.NS_QUAL_CALDAV,null,null,null, "NEEDS-ACTION")); // append into ATTENDEE prop-filter query.getCompFilter().getCompFilters().get(0) .getPropFilters().get(0).addParamFilter(paramSentBy); log.info(printQuery(query)); } catch (CalDAV4JException e) { e.printStackTrace(); assertTrue(false); } } @Test public void constructor() throws Exception { GenerateQuery gq = new GenerateQuery(); String s = XMLUtils.prettyPrint(gq.generate()); assertTrue(s.contains(CalDAVConstants.ELEM_ALLPROP)); log.info(s); gq = new GenerateQuery(null,null); s = XMLUtils.prettyPrint(gq.generate()); assertTrue(s.contains(CalDAVConstants.ELEM_ALLPROP)); log.info(s); gq = new GenerateQuery(Component.VTODO,null); s = XMLUtils.prettyPrint(gq.generate()); log.info(s); gq = new GenerateQuery(null,Component.VTODO); assertTrue(s.contains(CalDAVConstants.ELEM_ALLPROP)); s = XMLUtils.prettyPrint(gq.generate()); log.info(s); } }