/******************************************************************************* | |
* Copyright (c) 2014, 2016 Orange. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
*******************************************************************************/ | |
package org.eclipse.om2m.ipe.sdt.testsuite.subscription; | |
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.Date; | |
import javax.servlet.ServletException; | |
import javax.servlet.http.HttpServlet; | |
import javax.servlet.http.HttpServletRequest; | |
import javax.servlet.http.HttpServletResponse; | |
import org.eclipse.om2m.commons.resource.AbstractFlexContainer; | |
import org.eclipse.om2m.commons.resource.Notification; | |
import org.eclipse.om2m.commons.resource.Notification.NotificationEvent; | |
import org.eclipse.om2m.commons.resource.Notification.NotificationEvent.Representation; | |
import org.eclipse.om2m.datamapping.service.DataMapperService; | |
import org.osgi.service.http.HttpService; | |
import org.osgi.service.http.NamespaceException; | |
public class SubscriptionHttpServlet extends HttpServlet { | |
private static final String SERVLET_PATH_PREFIX = "/subscription_"; | |
private final String servletPath; | |
private final HttpService httpService; | |
private final DataMapperService dataMapperService; | |
private final NotificationQueue notificationQueue; | |
private boolean openToStoreNotification = false; | |
public SubscriptionHttpServlet(final HttpService pHttpService, final DataMapperService pDataMapperService, | |
final NotificationQueue pNotificationQueue, final String moduleName) { | |
this.httpService = pHttpService; | |
this.dataMapperService = pDataMapperService; | |
this.notificationQueue = pNotificationQueue; | |
this.servletPath = SERVLET_PATH_PREFIX + System.currentTimeMillis() + moduleName; | |
} | |
/** | |
* register http servlet | |
* | |
* @return true if successfully registered | |
*/ | |
protected boolean register() { | |
try { | |
httpService.registerServlet(servletPath, this, null, null); | |
} catch (ServletException | NamespaceException e) { | |
return false; | |
} | |
return true; | |
} | |
/** | |
* unregister http servlet | |
*/ | |
protected void unregister() { | |
httpService.unregister(servletPath); | |
} | |
protected String getServletPath() { | |
return servletPath; | |
} | |
protected void storeNotification() { | |
openToStoreNotification = true; | |
} | |
@Override | |
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { | |
// read input stream | |
BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream())); | |
String line = null; | |
StringBuffer sb = new StringBuffer(); | |
while ((line = br.readLine()) != null) { | |
sb.append(line); | |
} | |
// marshalling | |
Notification notification = (Notification) dataMapperService.stringToObj(sb.toString()); | |
// check if the request is a verification request | |
boolean verifRequest = (notification.isVerificationRequest() != null | |
? notification.isVerificationRequest().booleanValue() : false); | |
if (verifRequest) { | |
// return OK | |
resp.setStatus(HttpServletResponse.SC_OK); | |
} else { | |
// notification | |
NotificationEvent notifEvent = notification.getNotificationEvent(); | |
Representation representation = notifEvent.getRepresentation(); | |
if (representation.getResource() instanceof AbstractFlexContainer) { | |
AbstractFlexContainer notifiedFlexContainer = (AbstractFlexContainer) representation.getResource(); | |
ReceivedNotification receivedNotification = new ReceivedNotification(notifiedFlexContainer, new Date()); | |
if (openToStoreNotification) { | |
this.notificationQueue.addNotificationFromOM2M(receivedNotification); | |
} | |
} | |
resp.setStatus(HttpServletResponse.SC_OK); | |
} | |
} | |
} |