package org.infoglue.calendar.controllers; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringWriter; import java.io.Writer; import java.sql.Blob; import java.util.Date; import java.util.Iterator; import java.util.LinkedList; import java.util.Set; import net.fortuna.ical4j.data.CalendarBuilder; import net.fortuna.ical4j.data.CalendarOutputter; import net.fortuna.ical4j.data.FoldingWriter; import net.fortuna.ical4j.model.Calendar; import net.fortuna.ical4j.model.DateTime; 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.component.VEvent; import net.fortuna.ical4j.model.component.VTimeZone; import net.fortuna.ical4j.model.parameter.TzId; import net.fortuna.ical4j.model.property.CalScale; import net.fortuna.ical4j.model.property.Description; import net.fortuna.ical4j.model.property.ProdId; import net.fortuna.ical4j.model.property.Uid; import net.fortuna.ical4j.model.property.Version; import net.fortuna.ical4j.util.CompatibilityHints; import net.fortuna.ical4j.util.UidGenerator; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.infoglue.calendar.entities.Event; import org.infoglue.calendar.entities.EventVersion; import org.infoglue.calendar.entities.Language; import org.infoglue.calendar.entities.Location; import org.infoglue.calendar.entities.Resource; import org.infoglue.calendar.util.ICalendar; import org.infoglue.calendar.util.ICalendarVEvent; import org.infoglue.common.util.PropertyHelper; public class ICalendarController extends BasicController { private ICalendarController(){} public static final ICalendarController getICalendarController() { return new ICalendarController(); } /** * This method returns a ICalendar based on it's primary key */ public String getICalendarUrl(Long id, Session session) throws Exception { String url = ""; Event event = EventController.getController().getEvent(id, session); Language masterLanguage = LanguageController.getController().getMasterLanguage(session); String calendarPath = PropertyHelper.getProperty("calendarsPath"); String fileName = "event_" + event.getId() + ".vcs"; getVCalendar(event, masterLanguage, calendarPath + fileName); String urlBase = PropertyHelper.getProperty("urlBase"); url = urlBase + "calendars/" + fileName; return url; } public void getVCalendar(Event event, Language language, String file) throws Exception { Set versions = event.getVersions(); Iterator versionsIterator = versions.iterator(); EventVersion eventVersion = null; EventVersion eventVersionCandidate = null; while(versionsIterator.hasNext()) { eventVersionCandidate = (EventVersion)versionsIterator.next(); if(eventVersionCandidate.getLanguage().getId().equals(language.getId())) { eventVersion = eventVersionCandidate; break; } } if(eventVersion == null && eventVersionCandidate != null) eventVersion = eventVersionCandidate; ICalendar iCal = new ICalendar(); iCal.icalEventCollection = new LinkedList(); iCal.setProdId("InfoGlueCalendar"); iCal.setVersion("1.0"); // Event Test ICalendarVEvent vevent = new ICalendarVEvent(); Date workDate = new Date(); vevent.setDateStart(event.getStartDateTime().getTime()); vevent.setDateEnd(event.getEndDateTime().getTime()); vevent.setSummary(eventVersion.getName()); if(eventVersion != null) vevent.setDescription(eventVersion.getDescription()); else vevent.setDescription("No description set"); vevent.setSequence(0); vevent.setEventClass("PUBLIC"); vevent.setTransparency("OPAQUE"); vevent.setDateStamp(workDate); vevent.setCreated(workDate); vevent.setLastModified(workDate); if(eventVersion != null) vevent.setOrganizer(eventVersion.getOrganizerName()); else vevent.setOrganizer("MAILTO:sfg@eurekait.com"); vevent.setUid("igcal-"+workDate); vevent.setPriority(3); String locationString = null; if(eventVersion.getAlternativeLocation() != null && !eventVersion.getAlternativeLocation().equals("")) locationString = eventVersion.getAlternativeLocation() + ", "; else { Iterator locationsIterator = event.getLocations().iterator(); while(locationsIterator.hasNext()) { Location location = (Location)locationsIterator.next(); String localizedName = location.getLocalizedName("en","sv"); locationString += localizedName + ", "; } if(eventVersion.getCustomLocation() != null && !eventVersion.getCustomLocation().equals("")) locationString += eventVersion.getCustomLocation(); } vevent.setLocation(locationString); iCal.icalEventCollection.add(vevent); // Now write to string and view as file. //writeUTF8ToFile(new File(file), iCal.getVCalendar(), false); writeISO88591ToFile(new File(file), iCal.getVCalendar(), false); //writeUTF8ToFile(new File("c:/calendar.vcs"), iCal.getVCalendar(), false); } public void getICalendar(Event event, Language language, String file) throws Exception { Set versions = event.getVersions(); Iterator versionsIterator = versions.iterator(); EventVersion eventVersion = null; EventVersion eventVersionCandidate = null; while(versionsIterator.hasNext()) { eventVersionCandidate = (EventVersion)versionsIterator.next(); if(eventVersionCandidate.getLanguage().getId().equals(language.getId())) { eventVersion = eventVersionCandidate; break; } } if(eventVersion == null && eventVersionCandidate != null) eventVersion = eventVersionCandidate; String locationString = ""; if(eventVersion.getAlternativeLocation() != null && !eventVersion.getAlternativeLocation().equals("")) locationString = eventVersion.getAlternativeLocation(); else { Iterator locationsIterator = event.getLocations().iterator(); while(locationsIterator.hasNext()) { Location location = (Location)locationsIterator.next(); String localizedName = location.getLocalizedName("en","sv"); if(!locationString.equals("") && !locationString.endsWith(", ")) locationString += ", "; locationString += localizedName; } if(eventVersion.getCustomLocation() != null && !eventVersion.getCustomLocation().equals("")) if(!locationString.equals("") && !locationString.endsWith(", ")) locationString += ", "; locationString += eventVersion.getCustomLocation(); } try { TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry(); TimeZone timezone = registry.getTimeZone("Europe/Stockholm"); VTimeZone tz = timezone.getVTimeZone(); //Create the event DateTime start = new DateTime(event.getStartDateTime().getTime()); DateTime end = new DateTime(event.getEndDateTime().getTime()); VEvent meeting = new VEvent(start, end, eventVersion.getName()); meeting.getProperties().add(tz.getTimeZoneId()); net.fortuna.ical4j.model.property.Location iCalLocation = new net.fortuna.ical4j.model.property.Location(locationString); meeting.getProperties().add(iCalLocation); Description iCalDescription = new Description("" + eventVersion.getLongDescription()); meeting.getProperties().add(iCalDescription); //Create a calendar Calendar icsCalendar = new Calendar(); icsCalendar.getProperties().add(new ProdId("-//InfoGlue//InfoGlue Calendar 1.0//EN")); icsCalendar.getProperties().add(CalScale.GREGORIAN); UidGenerator ug = new UidGenerator("uidGen"); Uid uid = ug.generateUid(); icsCalendar.getProperties().add(uid); //Add the event and print icsCalendar.getComponents().add(meeting); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-1")); CalendarBuilder builder = new CalendarBuilder(); CalendarOutputter outputter = new CalendarOutputter(false, FoldingWriter.REDUCED_FOLD_LENGTH); outputter.setValidating(false); outputter.output(icsCalendar, out); //out.flush(); //out.close(); } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } /* if(eventVersion != null) vevent.setDescription(eventVersion.getDescription()); else vevent.setDescription("No description set"); vevent.setSequence(0); vevent.setEventClass("PUBLIC"); vevent.setTransparency("OPAQUE"); vevent.setDateStamp(workDate); vevent.setCreated(workDate); vevent.setLastModified(workDate); if(eventVersion != null) vevent.setOrganizer(eventVersion.getOrganizerName()); else vevent.setOrganizer("MAILTO:sfg@eurekait.com"); vevent.setUid("igcal-"+workDate); vevent.setPriority(3); vevent.setLocation(locationString); iCal.icalEventCollection.add(vevent); writeISO88591ToFile(new File(file), iCal.getVCalendar(), false); */ } public synchronized void writeUTF8ToFile(File file, String text, boolean isAppend) throws Exception { Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF8")); out.write(text); out.flush(); out.close(); } public synchronized void writeISO88591ToFile(File file, String text, boolean isAppend) throws Exception { Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-1")); out.write(text); out.flush(); out.close(); } }