mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-13 03:02:22 -05:00
Ews: improve invalid item in calendar error handling
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1520 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
7180507a2b
commit
18584e259d
@ -912,35 +912,41 @@ public abstract class EWSMethod extends PostMethod {
|
|||||||
protected void processResponseBody(HttpState httpState, HttpConnection httpConnection) {
|
protected void processResponseBody(HttpState httpState, HttpConnection httpConnection) {
|
||||||
Header contentTypeHeader = getResponseHeader("Content-Type");
|
Header contentTypeHeader = getResponseHeader("Content-Type");
|
||||||
if (contentTypeHeader != null && "text/xml; charset=utf-8".equals(contentTypeHeader.getValue())) {
|
if (contentTypeHeader != null && "text/xml; charset=utf-8".equals(contentTypeHeader.getValue())) {
|
||||||
responseItems = new ArrayList<Item>();
|
|
||||||
XMLStreamReader reader;
|
|
||||||
try {
|
try {
|
||||||
reader = XMLStreamUtil.createXMLStreamReader(getResponseBodyAsStream());
|
processResponseStream(getResponseBodyAsStream());
|
||||||
while (reader.hasNext()) {
|
|
||||||
reader.next();
|
|
||||||
handleErrors(reader);
|
|
||||||
if (serverVersion == null && XMLStreamUtil.isStartTag(reader, "ServerVersionInfo")) {
|
|
||||||
String majorVersion = getAttributeValue(reader, "MajorVersion");
|
|
||||||
if ("14".equals(majorVersion)) {
|
|
||||||
serverVersion = "Exchange2010";
|
|
||||||
} else {
|
|
||||||
serverVersion = "Exchange2007_SP1";
|
|
||||||
}
|
|
||||||
} else if (XMLStreamUtil.isStartTag(reader, responseCollectionName)) {
|
|
||||||
handleItems(reader);
|
|
||||||
} else {
|
|
||||||
handleCustom(reader);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
logger.error("Error while parsing soap response: " + e, e);
|
logger.error("Error while parsing soap response: " + e, e);
|
||||||
} catch (XMLStreamException e) {
|
|
||||||
logger.error("Error while parsing soap response: " + e, e);
|
|
||||||
}
|
}
|
||||||
if (errorDetail != null) {
|
}
|
||||||
logger.debug(errorDetail);
|
}
|
||||||
|
|
||||||
|
protected void processResponseStream(InputStream inputStream) {
|
||||||
|
responseItems = new ArrayList<Item>();
|
||||||
|
XMLStreamReader reader;
|
||||||
|
try {
|
||||||
|
reader = XMLStreamUtil.createXMLStreamReader(inputStream);
|
||||||
|
while (reader.hasNext()) {
|
||||||
|
reader.next();
|
||||||
|
handleErrors(reader);
|
||||||
|
if (serverVersion == null && XMLStreamUtil.isStartTag(reader, "ServerVersionInfo")) {
|
||||||
|
String majorVersion = getAttributeValue(reader, "MajorVersion");
|
||||||
|
if ("14".equals(majorVersion)) {
|
||||||
|
serverVersion = "Exchange2010";
|
||||||
|
} else {
|
||||||
|
serverVersion = "Exchange2007_SP1";
|
||||||
|
}
|
||||||
|
} else if (XMLStreamUtil.isStartTag(reader, responseCollectionName)) {
|
||||||
|
handleItems(reader);
|
||||||
|
} else {
|
||||||
|
handleCustom(reader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} catch (XMLStreamException e) {
|
||||||
|
logger.error("Error while parsing soap response: " + e, e);
|
||||||
|
}
|
||||||
|
if (errorDetail != null) {
|
||||||
|
logger.debug(errorDetail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,7 +79,6 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
super(url, userName, password);
|
super(url, userName, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check endpoint url.
|
* Check endpoint url.
|
||||||
*
|
*
|
||||||
@ -109,6 +108,9 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void buildSessionInfo(HttpMethod method) throws DavMailException {
|
protected void buildSessionInfo(HttpMethod method) throws DavMailException {
|
||||||
|
// no need to check logon method body
|
||||||
|
method.releaseConnection();
|
||||||
|
|
||||||
// also need to retrieve email and alias
|
// also need to retrieve email and alias
|
||||||
getEmailAndAliasFromOptions();
|
getEmailAndAliasFromOptions();
|
||||||
if (email == null || alias == null) {
|
if (email == null || alias == null) {
|
||||||
@ -1038,10 +1040,13 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
protected class Event extends ExchangeSession.Event {
|
protected class Event extends ExchangeSession.Event {
|
||||||
// item id
|
// item id
|
||||||
ItemId itemId;
|
ItemId itemId;
|
||||||
|
String type;
|
||||||
|
|
||||||
protected Event(EWSMethod.Item response) {
|
protected Event(EWSMethod.Item response) {
|
||||||
itemId = new ItemId(response);
|
itemId = new ItemId(response);
|
||||||
|
|
||||||
|
type = response.type;
|
||||||
|
|
||||||
permanentUrl = response.get(Field.get("permanenturl").getResponseName());
|
permanentUrl = response.get(Field.get("permanenturl").getResponseName());
|
||||||
etag = response.get(Field.get("etag").getResponseName());
|
etag = response.get(Field.get("etag").getResponseName());
|
||||||
displayName = response.get(Field.get("displayname").getResponseName());
|
displayName = response.get(Field.get("displayname").getResponseName());
|
||||||
@ -1122,11 +1127,11 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
// handle mozilla alarm
|
// handle mozilla alarm
|
||||||
String xMozLastack = vCalendar.getFirstVeventPropertyValue("X-MOZ-LASTACK");
|
String xMozLastack = vCalendar.getFirstVeventPropertyValue("X-MOZ-LASTACK");
|
||||||
if (xMozLastack != null) {
|
if (xMozLastack != null) {
|
||||||
updates.add(Field.createFieldUpdate("xmozlastack", xMozLastack));
|
updates.add(Field.createFieldUpdate("xmozlastack", xMozLastack));
|
||||||
}
|
}
|
||||||
String xMozSnoozeTime = vCalendar.getFirstVeventPropertyValue("X-MOZ-SNOOZE-TIME");
|
String xMozSnoozeTime = vCalendar.getFirstVeventPropertyValue("X-MOZ-SNOOZE-TIME");
|
||||||
if (xMozSnoozeTime != null) {
|
if (xMozSnoozeTime != null) {
|
||||||
updates.add(Field.createFieldUpdate("xmozsnoozetime", xMozSnoozeTime));
|
updates.add(Field.createFieldUpdate("xmozsnoozetime", xMozSnoozeTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vCalendar.isMeeting()) {
|
if (vCalendar.isMeeting()) {
|
||||||
@ -1191,12 +1196,14 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, true);
|
GetItemMethod getItemMethod = new GetItemMethod(BaseShape.ID_ONLY, itemId, true);
|
||||||
getItemMethod.addAdditionalProperty(Field.get("reminderset"));
|
if (!"Message".equals(type)) {
|
||||||
getItemMethod.addAdditionalProperty(Field.get("calendaruid"));
|
getItemMethod.addAdditionalProperty(Field.get("reminderset"));
|
||||||
getItemMethod.addAdditionalProperty(Field.get("requiredattendees"));
|
getItemMethod.addAdditionalProperty(Field.get("calendaruid"));
|
||||||
getItemMethod.addAdditionalProperty(Field.get("optionalattendees"));
|
getItemMethod.addAdditionalProperty(Field.get("requiredattendees"));
|
||||||
getItemMethod.addAdditionalProperty(Field.get("xmozlastack"));
|
getItemMethod.addAdditionalProperty(Field.get("optionalattendees"));
|
||||||
getItemMethod.addAdditionalProperty(Field.get("xmozsnoozetime"));
|
getItemMethod.addAdditionalProperty(Field.get("xmozlastack"));
|
||||||
|
getItemMethod.addAdditionalProperty(Field.get("xmozsnoozetime"));
|
||||||
|
}
|
||||||
|
|
||||||
executeMethod(getItemMethod);
|
executeMethod(getItemMethod);
|
||||||
content = getItemMethod.getMimeContent();
|
content = getItemMethod.getMimeContent();
|
||||||
@ -1212,7 +1219,7 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
List<EWSMethod.Attendee> attendees = getItemMethod.getResponseItem().getAttendees();
|
List<EWSMethod.Attendee> attendees = getItemMethod.getResponseItem().getAttendees();
|
||||||
if (attendees != null) {
|
if (attendees != null) {
|
||||||
for (EWSMethod.Attendee attendee : attendees) {
|
for (EWSMethod.Attendee attendee : attendees) {
|
||||||
VProperty attendeeProperty = new VProperty("ATTENDEE", "mailto:"+attendee.email);
|
VProperty attendeeProperty = new VProperty("ATTENDEE", "mailto:" + attendee.email);
|
||||||
attendeeProperty.addParam("CN", attendee.name);
|
attendeeProperty.addParam("CN", attendee.name);
|
||||||
attendeeProperty.addParam("PARTSTAT", attendee.partstat);
|
attendeeProperty.addParam("PARTSTAT", attendee.partstat);
|
||||||
attendeeProperty.addParam("ROLE", attendee.role);
|
attendeeProperty.addParam("ROLE", attendee.role);
|
||||||
@ -1259,7 +1266,19 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
condition,
|
condition,
|
||||||
FolderQueryTraversal.SHALLOW, 0);
|
FolderQueryTraversal.SHALLOW, 0);
|
||||||
for (EWSMethod.Item response : responses) {
|
for (EWSMethod.Item response : responses) {
|
||||||
events.add(new Event(response));
|
Event event = new Event(response);
|
||||||
|
if ("Message".equals(event.type)) {
|
||||||
|
// need to check body
|
||||||
|
try {
|
||||||
|
event.getEventContent();
|
||||||
|
events.add(event);
|
||||||
|
} catch (HttpException e) {
|
||||||
|
LOGGER.warn("Ignore invalid event "+event.getHref());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
events.add(event);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return events;
|
return events;
|
||||||
@ -1319,7 +1338,9 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
return new Contact(item);
|
return new Contact(item);
|
||||||
} else if ("CalendarItem".equals(itemType)
|
} else if ("CalendarItem".equals(itemType)
|
||||||
|| "MeetingRequest".equals(itemType)) {
|
|| "MeetingRequest".equals(itemType)
|
||||||
|
// VTODOs appear as Messages
|
||||||
|
|| "Message".equals(itemType)) {
|
||||||
return new Event(item);
|
return new Event(item);
|
||||||
} else {
|
} else {
|
||||||
throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND");
|
throw new DavMailException("EXCEPTION_ITEM_NOT_FOUND");
|
||||||
@ -1660,7 +1681,7 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
executeMethod(resolveNamesMethod);
|
executeMethod(resolveNamesMethod);
|
||||||
List<EWSMethod.Item> responses = resolveNamesMethod.getResponseItems();
|
List<EWSMethod.Item> responses = resolveNamesMethod.getResponseItems();
|
||||||
if (LOGGER.isDebugEnabled()) {
|
if (LOGGER.isDebugEnabled()) {
|
||||||
LOGGER.debug("ResolveNames(" + searchValue + ") returned "+responses.size()+" results");
|
LOGGER.debug("ResolveNames(" + searchValue + ") returned " + responses.size() + " results");
|
||||||
}
|
}
|
||||||
for (EWSMethod.Item response : responses) {
|
for (EWSMethod.Item response : responses) {
|
||||||
Contact contact = buildGalfindContact(response);
|
Contact contact = buildGalfindContact(response);
|
||||||
|
@ -98,6 +98,21 @@ public class TestExchangeSessionCalendar extends AbstractExchangeSessionTestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testReportCalendar() throws IOException {
|
||||||
|
List<ExchangeSession.Event> events = null;
|
||||||
|
try {
|
||||||
|
events = session.getAllEvents("/users/" + session.getEmail() + "/calendar");
|
||||||
|
for (ExchangeSession.Event event : events) {
|
||||||
|
System.out.println(event.subject);
|
||||||
|
ExchangeSession.Item item = session.getItem("/users/" + session.getEmail() + "/calendar", event.itemName);
|
||||||
|
System.out.println(item.getBody());
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void testGetFreeBusyData() throws IOException, MessagingException {
|
public void testGetFreeBusyData() throws IOException, MessagingException {
|
||||||
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
|
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
|
||||||
cal.set(Calendar.MONTH, 7);
|
cal.set(Calendar.MONTH, 7);
|
||||||
|
Loading…
Reference in New Issue
Block a user