/*
* Copyright (C) 2010-2012 Stichting Akvo (Akvo Foundation)
*
* This file is part of Akvo FLOW.
*
* Akvo FLOW is free software: you can redistribute it and modify it under the terms of
* the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
* either version 3 of the License or any later version.
*
* Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License included below for more details.
*
* The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
*/
package com.gallatinsystems.notification;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.gallatinsystems.framework.rest.AbstractRestApiServlet;
import com.gallatinsystems.framework.rest.RestRequest;
import com.gallatinsystems.framework.rest.RestResponse;
/**
* Receives task queue work items and calls the appropriate handler based on the type (implemented
* in sub classes)
*
* @author Christopher Fagiani
*/
public abstract class NotificationProcessor extends AbstractRestApiServlet {
private static final long serialVersionUID = -4726303161585277346L;
protected Map<String, String> notificationTypeMap;
public NotificationProcessor() {
super();
notificationTypeMap = new HashMap<String, String>();
initializeTypeMapping();
}
/**
* subclasses should implement this method in such a way that maps a given notificationType to
* an instance of the appropriate NotificationHelper.
*/
protected abstract void initializeTypeMapping();
/**
* converts the servlet request into an instance of NotificationRequest
*/
@Override
protected RestRequest convertRequest() throws Exception {
HttpServletRequest req = getRequest();
NotificationRequest restRequest = new NotificationRequest();
restRequest.populateFromHttpRequest(req);
return restRequest;
}
/**
* looks up the appropriate notification handler in the type map (using the Type passed in on
* the request) and invokes it
*/
@SuppressWarnings("rawtypes")
@Override
protected RestResponse handleRequest(RestRequest request) throws Exception {
RestResponse response = new RestResponse();
NotificationRequest notificationRequest = (NotificationRequest) request;
String className = notificationTypeMap.get(notificationRequest
.getType());
if (className != null) {
Class cls = Class.forName(className);
NotificationHandler handler = (NotificationHandler) cls
.newInstance();
HttpServletRequest req = getRequest();
String serverBase = req.getScheme()
+ "://"
+ req.getServerName()
+ ((req.getLocalPort() != 80 && req.getLocalPort() != 443 && req
.getLocalPort() != 0) ? ":" + req.getLocalPort()
: "");
handler.generateNotification(notificationRequest.getType(),
notificationRequest.getNotifEntityId(),
notificationRequest.getDestinations(),
notificationRequest.getDestOptions(), serverBase);
} else {
log("Could not find notification handler for type: "
+ notificationRequest.getType());
}
return response;
}
}