/** | |
* Copyright (c) 2011 Ericsson and others. | |
* | |
* All rights reserved. This program and the accompanying materials are | |
* made available under the terms of the Eclipse Public License v1.0 which | |
* accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* Ericsson Research Canada - Initial implementation | |
* | |
*/ | |
package org.eclipse.mylyn.reviews.vcalendar.core; | |
import java.text.SimpleDateFormat; | |
import java.util.Locale; | |
import java.util.TimeZone; | |
import org.eclipse.mylyn.reviews.notifications.core.IMeetingData; | |
/** | |
* @author Jacques Bouthillier | |
* | |
* @version $Revision: 1.0 $ | |
*/ | |
public class VCalendar { | |
private long fTIME_ZONE_OFFSET = TimeZone.getDefault().getOffset( | |
System.currentTimeMillis()); | |
private final String fNEW_LINE = "\n"; | |
private final String fGMT_TIME = "Z"; | |
private final SimpleDateFormat fDATE_FORMAT = new SimpleDateFormat( | |
"yyyyMMdd'T'HHmmss", new Locale("eng", "US")); | |
public VCalendar() { | |
} | |
/** | |
* Build the VCalendar and return it as a String | |
* | |
* @param aInfo | |
* Meeting data information | |
* @param aMsgBody | |
* @param aFrom | |
* Creator of the calendar | |
* @param aEmails | |
* List of email's of the recipients | |
* @return | |
*/ | |
public String createVCalendar(IMeetingData aInfo, String aFrom, | |
String[] aEmails) { | |
StringBuffer sb = new StringBuffer(); | |
sb.append("BEGIN:VCALENDAR"); | |
sb.append(fNEW_LINE); | |
sb.append("PRODID:-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN"); | |
sb.append(fNEW_LINE); | |
sb.append("VERSION:1.0"); | |
sb.append(fNEW_LINE); | |
sb.append("BEGIN:VEVENT"); | |
sb.append(fNEW_LINE); | |
sb.append("ATTENDEE:"); | |
sb.append(getAttendee(aEmails)); | |
sb.append(fNEW_LINE); | |
sb.append("DTSTART:"); | |
sb.append(getStartDate(aInfo)); | |
sb.append(fGMT_TIME); | |
sb.append(fNEW_LINE); | |
sb.append("DTEND:"); | |
sb.append(getEndDate(aInfo)); | |
sb.append(fGMT_TIME); | |
sb.append(fNEW_LINE); | |
sb.append("LOCATION:"); | |
sb.append(aInfo.getLocation()); | |
sb.append(fNEW_LINE); | |
sb.append("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:"); | |
sb.append(reformatMessageBody(aInfo.getBody())); | |
sb.append("=0D=0A"); | |
sb.append(fNEW_LINE); | |
sb.append("SUMMARY;ENCODING=QUOTED-PRINTABLE:"); | |
sb.append(aInfo.getSubject()); | |
sb.append(fNEW_LINE); | |
sb.append("PRIORITY:3"); | |
sb.append(fNEW_LINE); | |
sb.append("END:VEVENT"); | |
sb.append(fNEW_LINE); | |
sb.append("END:VCALENDAR"); | |
return sb.toString(); | |
} | |
/** | |
* Reformat the content of the message to replace "\n" char by the | |
* appropriate value to be used in the vCalendar | |
* | |
* @param aBody | |
* String | |
* @return String | |
*/ | |
private String reformatMessageBody(String aBody) { | |
String lineSeparator = System.getProperty("line.separator"); | |
String str = aBody.trim().replaceAll(lineSeparator, "=0D=0A"); //line feed + carriage return | |
str = str.replaceAll("\n", "=0D=0A"); //new line | |
str = str.replaceAll("\r", "=0D=0A"); //CR | |
return str; | |
} | |
/** | |
* Get the list of attendee email's to include in the Vcalendar | |
* | |
* @return String | |
*/ | |
private String getAttendee(String[] aEmails) { | |
StringBuffer sb = new StringBuffer(); | |
int size = aEmails.length; | |
for (int i = 0; i < size; i++) { | |
sb.append("\"MAILTO:"); | |
sb.append(aEmails[i]); | |
if (i < (size - 1)) { | |
sb.append("\","); // Separator between attendees | |
} else { | |
sb.append('"'); // End quotes only | |
} | |
} | |
return sb.toString(); | |
} | |
/** | |
* Compute a date the decision meeting should take place | |
* | |
* @return String | |
*/ | |
private String getStartDate(IMeetingData aInfo) { | |
return fDATE_FORMAT.format(aInfo.getStartTime() - fTIME_ZONE_OFFSET); | |
} | |
/** | |
* Compute the end meeting date and time | |
* | |
* @return String | |
*/ | |
private String getEndDate(IMeetingData aInfo) { | |
Long timeDuration= (long) (aInfo.getDuration() * 60 * 1000); //convert minutes to millisec | |
return fDATE_FORMAT.format(aInfo.getStartTime() + timeDuration- fTIME_ZONE_OFFSET); | |
} | |
} |