4

我使用Java EWS library通過iCalUid(例如iCalUid我有:040000008200E00074C5B7101A82E00800000000F66E2C0D59A9D001000000000000000010000000F7A6AACB779B00429164F39AE6DD6BB9)在用戶的日曆中搜索約會。這裏是我的Scala代碼:如何使用Java EWS API搜索iCalUid的Exchange約會?

import microsoft.exchange.webservices.data._ 

import java.net.URI 
import java.util.Date 

val exchange = { 
    val service = new ExchangeService(ExchangeVersion.Exchange2010_SP2) 
    service.setUrl(new URI(host)) 
    service.setCredentials(new WebCredentials(user, pass)) 
    service 
} 

def calendarFolderFor(email: String) = new FolderId(WellKnownFolderName.Calendar, Mailbox.getMailboxFromString(email)) 

def findMatchingAppointments(iCalUid: String, email: String) = { 
    val searchFilter = new SearchFilter.IsEqualTo(AppointmentSchema.ICalUid, iCalUid) 
    exchange.findItems(calendarFolderFor(email), searchFilter, new ItemView(1)).getItems 
} 

上面的代碼引發此錯誤:

microsoft.exchange.webservices.data.ServiceResponseException: The property can not be used with this type of restriction. 
    at microsoft.exchange.webservices.data.ServiceResponse.internalThrowIfNecessary(ServiceResponse.java:262) ~[ews-java-api-1.3-SNAPSHOT.jar:na] 
    at microsoft.exchange.webservices.data.ServiceResponse.throwIfNecessary(ServiceResponse.java:251) ~[ews-java-api-1.3-SNAPSHOT.jar:na] 
    at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:146) ~[ews-java-api-1.3-SNAPSHOT.jar:na] 
    at microsoft.exchange.webservices.data.ExchangeService.findItems(ExchangeService.java:807) ~[ews-java-api-1.3-SNAPSHOT.jar:na] 
    at microsoft.exchange.webservices.data.ExchangeService.findItems(ExchangeService.java:851) ~[ews-java-api-1.3-SNAPSHOT.jar:na] 

然後我試圖從this thread適應代碼:

def findMatchingAppointments(iCalUid: String, email: String) = { 
    import org.apache.commons.codec.binary.{Hex, Base64} 
    val searchFilter = new SearchFilter.IsEqualTo(
    new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Appointment, 0x03, MapiPropertyType.Binary), 
    Base64.encodeBase64String(Hex.decodeHex(iCalUid.toCharArray)) 
) 
    val view = new ItemView(1) 
    view.setPropertySet(new PropertySet(BasePropertySet.FirstClassProperties, AppointmentSchema.ICalUid))   
    exchange.findItems(calendarFolderFor(email), searchFilter, view).getItems 
} 

但是,現在不投一個例外,但它也沒有找到約會。我知道約會存在,因爲我蠻力,並發現使用這段代碼約會:

def bruteForceFind(start: Date, end: Date, iCalUid: String, email: String) = { 
    val view = new CalendarView(start, end, 100) 
    exchange.findAppointments(calendarFolderFor(email), view).getItems 
    val allAppointments = exchange.findAppointments(calendarFolderFor(email), view).getItems 
    allAppointments.filter(_.getICalUid == iCalUid) 
} 

我做錯了什麼?我如何搜索給定iCalUid的用戶的約會?工作Java/Scala代碼也可以。

回答

5

顯然會議和約會是有區別的。更換這行:

new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Appointment, 0x03, MapiPropertyType.Binary), 

new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Meeting, 0x03, MapiPropertyType.Binary) 

作品。

+0

約會是一個簡單的日曆條目,只要您添加一個或多個與會者即可變成會議。小警告:當您從會議中刪除所有參加者時,它會暫停會議,並且所有約會都將創建者設置爲不可見的參加者集 – ivo