Author: sletellier Date: 2011-04-13 11:29:05 +0000 (Wed, 13 Apr 2011) New Revision: 1192 Log: - Add ical4j dependency - Fill method ExportSamplingPlanICalendar - Fill test for ical Modified: trunk/wao-business/pom.xml trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java Modified: trunk/wao-business/pom.xml =================================================================== --- trunk/wao-business/pom.xml 2011-04-12 15:16:58 UTC (rev 1191) +++ trunk/wao-business/pom.xml 2011-04-13 11:29:05 UTC (rev 1192) @@ -65,6 +65,11 @@ <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> + <!-- ical --> + <dependency> + <groupId>ical4j</groupId> + <artifactId>ical4j</artifactId> + </dependency> <!-- CSV lib --> <dependency> <groupId>net.sourceforge.javacsv</groupId> Modified: trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java =================================================================== --- trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-04-12 15:16:58 UTC (rev 1191) +++ trunk/wao-business/src/main/java/fr/ifremer/wao/service/ServiceSamplingImpl.java 2011-04-13 11:29:05 UTC (rev 1192) @@ -89,6 +89,19 @@ import fr.ifremer.wao.io.csv2.Import; import fr.ifremer.wao.io.csv2.ImportModel; import fr.ifremer.wao.io.csv2.models.SamplingPlanImportExportModel; +import net.fortuna.ical4j.data.CalendarOutputter; +import net.fortuna.ical4j.model.Property; +import net.fortuna.ical4j.model.TimeZone; +import net.fortuna.ical4j.model.TimeZoneRegistry; +import net.fortuna.ical4j.model.TimeZoneRegistryFactory; +import net.fortuna.ical4j.model.ValidationException; +import net.fortuna.ical4j.model.component.VEvent; +import net.fortuna.ical4j.model.component.VTimeZone; +import net.fortuna.ical4j.model.parameter.Value; +import net.fortuna.ical4j.model.property.CalScale; +import net.fortuna.ical4j.model.property.ProdId; +import net.fortuna.ical4j.model.property.Uid; +import net.fortuna.ical4j.model.property.Version; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; @@ -109,9 +122,12 @@ import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; import java.text.DateFormat; import java.text.NumberFormat; import java.text.ParseException; @@ -1510,18 +1526,64 @@ } @Override - protected InputStream executeExportSamplingPlanICalendar(TopiaContext transaction, ConnectedUser connectedUser) throws TopiaException { + protected InputStream executeExportSamplingPlanICalendar(TopiaContext transaction, ConnectedUser connectedUser) throws TopiaException, IOException, ValidationException, ParseException { SamplingFilter samplingFilter = executeNewSamplingFilter(transaction, connectedUser); List<SampleRow> samplingPlan = executeGetSampleRowsByFilter(transaction, samplingFilter); - // TODO 20110411 bleny make it generate an iCal + // Obord no sampling plan are found + if (samplingPlan.isEmpty()) { + log.warn("No samplingPlan found for user " + connectedUser.getLogin() + ", abording"); + return null; + } + + // Creating ical + net.fortuna.ical4j.model.Calendar cal = new net.fortuna.ical4j.model.Calendar(); + cal.getProperties().add(new ProdId("-//Events Calendar//iCal4j 1.0//EN")); + cal.getProperties().add(Version.VERSION_2_0); + cal.getProperties().add(CalScale.GREGORIAN); + + // Creating a TimeZone + TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry(); + TimeZone timezone = registry.getTimeZone("Europe/Paris"); + VTimeZone tz = timezone.getVTimeZone(); + + // Fills events + if (log.isDebugEnabled()) { + log.debug("Filling calendar with " + samplingPlan.size() + " sampling plans"); + } for (SampleRow sampleRow : samplingPlan) { - Date day = sampleRow.getDay(); + net.fortuna.ical4j.model.Date day = new net.fortuna.ical4j.model.Date(sampleRow.getDay()); String eventDescription = sampleRow.getObservationUnit().getDescription(); + if (log.isDebugEnabled()) { + log.debug("Creating event " + eventDescription + " at time " + day); + } + // add an event at 'day' in iCal + VEvent event = new VEvent(day, eventDescription); + + // add timezone information.. + event.getProperties().add(tz.getTimeZoneId()); + + // initialise as an all-day event.. + event.getProperties().getProperty(Property.DTSTART).getParameters().add( + Value.DATE); + + // Generate a UID for the event.. + Uid uid = new Uid(sampleRow.getTopiaId()); + event.getProperties().add(uid); + + // Add event + cal.getComponents().add(event); } - return null; + // Creating pipe + PipedOutputStream out = new PipedOutputStream(); + PipedInputStream in = new PipedInputStream(out); + + CalendarOutputter outputter = new CalendarOutputter(); + outputter.output(cal, out); + + return in; } } Modified: trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java =================================================================== --- trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java 2011-04-12 15:16:58 UTC (rev 1191) +++ trunk/wao-business/src/test/java/fr/ifremer/wao/service/ObsDebTest.java 2011-04-13 11:29:05 UTC (rev 1192) @@ -40,6 +40,14 @@ import fr.ifremer.wao.entity.WaoUser; import fr.ifremer.wao.entity.WaoUserImpl; import fr.ifremer.wao.io.ImportResults; +import net.fortuna.ical4j.model.Calendar; +import net.fortuna.ical4j.model.Date; +import net.fortuna.ical4j.model.component.VEvent; +import net.fortuna.ical4j.model.parameter.Cn; +import net.fortuna.ical4j.model.parameter.Role; +import net.fortuna.ical4j.model.property.CalScale; +import net.fortuna.ical4j.model.property.ProdId; +import net.fortuna.ical4j.model.property.Version; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.junit.Assert; @@ -52,6 +60,7 @@ import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.List; /** @@ -381,19 +390,22 @@ } @Test - @Ignore("not yet implemented") public void observerCanExportHisRoadMapAsICalendar() throws IOException, WaoBusinessException { // first, the coordinator must add observers coordinatorCanAddObserversViaImport(); + manager.setCurrentDate(DateUtil.createDate(10, 2, 2010)); ServiceSampling serviceSampling = manager.getServiceSampling(); InputStream in = serviceSampling.exportSamplingPlanICalendar(joshAsObserver()); + String result = IOUtils.toString(in); if (log.isDebugEnabled()) { - log.debug("exported iCal for observer is " + IOUtils.toString(in)); + log.debug("exported iCal for observer is " + result); } - // TODO 20110411 bleny add assertions + Assert.assertEquals(1, StringUtils.countMatches(result, "BEGIN:VEVENT")); + Assert.assertTrue(result.contains("DTSTART;VALUE=DATE:20100213")); + Assert.assertTrue(result.contains("SUMMARY:GA-UO007 DESHAIES_POINTE NOIRE")); } }