0
votes

Does Microsoft support Java EWS API now-a-days? This doubt came up because I started seeing "The Archive Gallery has been retired" on their site.

What I am trying to do is to get the new mails from Microsoft outlook server by creating a Java EWS API client with streaming subscription.

My java code throws a NullPointerException on line conn.addSubscription(subscription); (code mentioned below).

Thanks in advance.

public class StreamSub implements INotificationEventDelegate, ISubscriptionErrorDelegate{
public static ExchangeService service;
public StreamSub() throws Exception {
    service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
    ExchangeCredentials credential = new WebCredentials("myemail","my password");
    service.setCredentials(credential);
    service.autodiscoverUrl("myemail");
    this.rep();
}
public void rep() throws Exception
{
    WellKnownFolderName sd = WellKnownFolderName.Calendar;
    FolderId folderid = new FolderId(sd);
    List<FolderId> folder = new ArrayList<FolderId>();
    folder.add(folderid);
    StreamingSubscription subscription = service.subscribeToStreamingNotifications(folder, EventType.Created, EventType.Deleted, EventType.Modified, EventType.Status);
    StreamingSubscriptionConnection conn = new StreamingSubscriptionConnection(service,30);
            conn.addSubscription(subscription);
            conn.addOnNotificationEvent(this);
            conn.addOnDisconnect(this);
    conn.open();
    //EmailMessage msg = new EmailMessage(service);
    //msg.setSubject("test");
    //msg.getToRecipients().add("my e-mail");
    //msg.send();
    //Thread.sleep(20000);
    conn.close();
    System.out.println("close");
}

The above code prints a stack trace:

java.lang.NullPointerException
at microsoft.exchange.webservices.data.Strings.(Strings.java:223)
at microsoft.exchange.webservices.data.SubscribeRequest.validate(SubscribeRequest.java:50)
at microsoft.exchange.webservices.data.SubscribeToStreamingNotificationsRequest.validate(SubscribeToStreamingNotificationsRequest.java:32)
at microsoft.exchange.webservices.data.ServiceRequestBase.validateAndEmitRequest(ServiceRequestBase.java:822)
at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:46)
at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:144)
at microsoft.exchange.webservices.data.ExchangeService.subscribeToStreamingNotifications(ExchangeService.java:2438)
at StreamSub.rep(StreamSub.java:21)
at StreamSub.(StreamSub.java:13)
at GUIS$3.actionPerformed(GUIS.java:81)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3311)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
microsoft.exchange.webservices.data.ServiceValidationException
at microsoft.exchange.webservices.data.SubscribeRequest.validate(SubscribeRequest.java:49)
at microsoft.exchange.webservices.data.SubscribeToStreamingNotificationsRequest.validate(SubscribeToStreamingNotificationsRequest.java:32)
at microsoft.exchange.webservices.data.ServiceRequestBase.validateAndEmitRequest(ServiceRequestBase.java:822)
at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:46)
at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:144)
at microsoft.exchange.webservices.data.ExchangeService.subscribeToStreamingNotifications(ExchangeService.java:2438)
at StreamSub.rep(StreamSub.java:21)
at StreamSub.(StreamSub.java:13)
at GUIS$3.actionPerformed(GUIS.java:81)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3311)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
1
it seems the old version of jcifs fixes the problem. but now i can't pull the appointment detailsprock
I can't answer your question about why the streaming subscription isn't working, but I can answer your question about the support for the EWS Java API. At this point, there are no planned updates for the EWS Java API. Version 1.2 was updated to support Exchange 2010 sP1, but there are no plans to release a new version for Exchange 2013. In version 1.2 you can modify the source code to fix bugs and make improvements in your own private branch of the code.Mimi Gentz

1 Answers

1
votes

You need to load the Strings.properties file (should be in the base directory of the downloaded API) for starters. Without that, it can't find error messages and throws the exception you see. Kind of ironic that it throws an error while processing an error. Put it in a resources folder (or wherever you like, really) and load it up in the Strings.java class. There's actually a bunch of commented-out code doing just that. Load it up and you should at least be able to get the actual error that's breaking your streaming subscription. Alternatively, attach a trace listener and print the XML of the response so you can dig through that and find the error message.

Ah, you've changed things a bit. Microsoft hasn't updated EWS Java 1.2 for about a year and a half. The project itself has moved to a new page, so it's still available:

http://code.msdn.microsoft.com/Exchange-EWS-Java-API-12-1a5a1143

They briefly had it under an Apache 2.0 license, but apparently that was in error and they reverted to the old license. I don't think Microsoft has ever "supported" EWS Java. The license for 1.2 explicitly says that it's an "as is" product and that they do not support it.

I dearly hope MS makes it available under an open source license or at least fixes a number of bugs, gives it a proper repository, etc. I'll have a bucket full of bugfixes to commit if they do. Until that happens (if at all), assume that it is still not supported. The only support for it is Technet, SO, etc, and yourself.