package eu.betaas.taas.qosmanager.api.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.log4j.Logger;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMAssignmentInternal;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMAssignmentStar;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMAssuredRequestStar;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMEquivalentThingServiceInternal;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMEquivalentThingServiceStar;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMRequestStar;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMThingInternal;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMThingServiceStar;
import eu.betaas.taas.bigdatamanager.database.hibernate.data.QoSMThingStar;
import eu.betaas.taas.bigdatamanager.database.service.IBigDataDatabaseService;
import eu.betaas.taas.qosmanager.api.QoSManagerInternalIF;
import eu.betaas.taas.qosmanager.api.QoSManagerNotificationIF;
import eu.betaas.taas.qosmanager.api.QoSRankList;
import eu.betaas.taas.qosmanager.api.QoSRankResults;
import eu.betaas.taas.qosmanager.heuristic.ReservationResults;
public class Utils {
private static Logger LOGTest = Logger.getLogger("betaas.testplan");
protected static Map<String, QoSRankResults> createNotifications(
Map<String, QoSMAssignmentStar> assignments, Map<String, QoSMEquivalentThingServiceStar> equivalents,
Map<String, QoSMThingServiceStar> thingservices, Map<String, QoSMThingStar> things) {
Map<String, QoSRankResults> ris = new HashMap<String, QoSRankResults>();
Set<String> gateways = new HashSet<String>();
Map<String, Set<QoSMAssignmentInternal>> risAss =
new HashMap<String, Set<QoSMAssignmentInternal>>();
for(QoSMAssignmentStar a : assignments.values()){
String thingserviceId = a.getId().getThingServiceId();
QoSMThingServiceStar ts = thingservices.get(thingserviceId);
QoSMThingStar t = things.get(ts.getDeviceId());
String gatewayId = t.getGatewayId();
gateways.add(gatewayId);
if(risAss.containsKey(gatewayId)){
if(risAss.get(gatewayId).isEmpty()){
//first assignment for the gateway
Set<QoSMAssignmentInternal> lst = new HashSet<QoSMAssignmentInternal>();
lst.add(new QoSMAssignmentInternal(a.getId().getServiceId(),
a.getId().getRequestId(), ts.getThingServiceId(), a.getTotalBatteryCost(),
a.getTotalComputationalCost()));
risAss.put(gatewayId, lst);
}
else{
Set<QoSMAssignmentInternal> lst = risAss.get(gatewayId);
lst.add(new QoSMAssignmentInternal(a.getId().getServiceId(),
a.getId().getRequestId(), ts.getThingServiceId(), a.getTotalBatteryCost(),
a.getTotalComputationalCost()));
risAss.put(gatewayId, lst);
}
}
else{
Set<QoSMAssignmentInternal> lst = new HashSet<QoSMAssignmentInternal>();
lst.add(new QoSMAssignmentInternal(a.getId().getServiceId(),
a.getId().getRequestId(), ts.getThingServiceId(), a.getTotalBatteryCost(),
a.getTotalComputationalCost()));
risAss.put(gatewayId, lst);
}
}
Map<String, Set<QoSMThingInternal>> risThing =
new HashMap<String, Set<QoSMThingInternal>>();
for(String deviceID : things.keySet()){
QoSMThingStar t = things.get(deviceID);
String gatewayId = t.getGatewayId();
gateways.add(gatewayId);
if(risThing.containsKey(gatewayId)){
if(risThing.get(gatewayId).isEmpty()){
//first assignment for the gateway
Set<QoSMThingInternal> lst = new HashSet<QoSMThingInternal>();
lst.add(new QoSMThingInternal(deviceID,t.getBatteryLevel(), t.getNumass(),
t.getCapacityUsed(), gatewayId));
risThing.put(gatewayId, lst);
}
else{
Set<QoSMThingInternal> lst = risThing.get(gatewayId);
lst.add(new QoSMThingInternal(deviceID,t.getBatteryLevel(), t.getNumass(),
t.getCapacityUsed(), gatewayId));
risThing.put(gatewayId, lst);
}
}
else{
Set<QoSMThingInternal> lst = new HashSet<QoSMThingInternal>();
lst.add(new QoSMThingInternal(deviceID,t.getBatteryLevel(), t.getNumass(),
t.getCapacityUsed(), gatewayId));
risThing.put(gatewayId, lst);
}
}
Map<String, Set<QoSMEquivalentThingServiceInternal>> risEq =
new HashMap<String, Set<QoSMEquivalentThingServiceInternal>>();
for(QoSMEquivalentThingServiceStar eq : equivalents.values()){
String serviceId = eq.getId().getServiceId();
Integer requestId = eq.getId().getRequestId();
String thingserviceId = eq.getId().getThingServiceId();
QoSMThingServiceStar ts = thingservices.get(thingserviceId);
QoSMThingStar t = things.get(ts.getDeviceId());
String gatewayId = t.getGatewayId();
gateways.add(gatewayId);
if(risEq.containsKey(gatewayId)){
if(risEq.get(gatewayId).isEmpty()){
//first assignment for the gateway
Set<QoSMEquivalentThingServiceInternal> lst =
new HashSet<QoSMEquivalentThingServiceInternal>();
lst.add(new QoSMEquivalentThingServiceInternal(serviceId,requestId,thingserviceId));
risEq.put(gatewayId, lst);
}
else{
Set<QoSMEquivalentThingServiceInternal> lst = risEq.get(gatewayId);
lst.add(new QoSMEquivalentThingServiceInternal(serviceId,requestId,thingserviceId));
risEq.put(gatewayId, lst);
}
}
else{
Set<QoSMEquivalentThingServiceInternal> lst =
new HashSet<QoSMEquivalentThingServiceInternal>();
lst.add(new QoSMEquivalentThingServiceInternal(serviceId,requestId,thingserviceId));
risEq.put(gatewayId, lst);
}
}
for(String gw : gateways)
{
QoSRankResults res = new QoSRankResults(true, risAss.get(gw), risThing.get(gw), risEq.get(gw));
ris.put(gw, res);
}
return ris;
}
protected static void create_response_for_requester(String serviceId, Map<String, QoSMAssignmentStar> assignments,
QoSRankList response) {
ArrayList<ArrayList<String>> listResponse = new ArrayList<ArrayList<String>>();
Map<Integer, ArrayList<String>> m_listResponse = new HashMap<Integer, ArrayList<String>>();
//Create response for the requester gateway
for(QoSMAssignmentStar a : assignments.values()){
if(a.getId().getServiceId().equals(serviceId)){
int reqId = a.getId().getRequestId();
if(m_listResponse.containsKey(reqId))
{
ArrayList<String> tmp = m_listResponse.get(reqId);
tmp.add(a.getId().getThingServiceId());
m_listResponse.put(reqId, tmp);
}
else{
ArrayList<String> tmp = new ArrayList<String>();
tmp.add(a.getId().getThingServiceId());
m_listResponse.put(reqId, tmp);
}
}
}
for(ArrayList<String> lst : m_listResponse.values()){
listResponse.add(lst);
}
response.setAssignments(listResponse);
}
protected static void create_total_assignment_for_involved_gateways(
Map<String, QoSMAssignmentStar> assignments,
Map<String, QoSRankResults> notifyMap,
Map<String, QoSMThingStar> things,
Map<String, QoSMRequestStar> requests,
Map<String, QoSMAssuredRequestStar> assuredrequests) {
//create total assignment for involved gateways
for(QoSMAssignmentStar a : assignments.values()){
String serviceId = a.getId().getServiceId();
Integer requestId = a.getId().getRequestId();
String key = serviceId + ":" + (int)requestId;
String ownerGW = "";
if(requests != null){
QoSMRequestStar request = requests.get(key);
ownerGW = request.getGatewayId();
}
else{
try{
QoSMAssuredRequestStar request = assuredrequests.get(key);
ownerGW = request.getGatewayId();
} catch(NullPointerException e){
continue;
}
}
if(notifyMap.containsKey(ownerGW)){
if(notifyMap.get(ownerGW).getAssignments() == null)
notifyMap.get(ownerGW).setAssignments(new HashSet<QoSMAssignmentInternal>());
notifyMap.get(ownerGW).getAssignments().add(new QoSMAssignmentInternal(serviceId, requestId,
a.getId().getThingServiceId(), a.getTotalBatteryCost(), a.getTotalComputationalCost()));
}
else{
notifyMap.put(ownerGW, new QoSRankResults(true, new HashSet<QoSMAssignmentInternal>(),
new HashSet<QoSMThingInternal>(),
new HashSet<QoSMEquivalentThingServiceInternal>()));
notifyMap.get(ownerGW).getAssignments().add(new QoSMAssignmentInternal(serviceId, requestId,
a.getId().getThingServiceId(), a.getTotalBatteryCost(), a.getTotalComputationalCost()));
}
}
}
protected static QoSRankList notify_assignment(Logger LOG, String serviceId, Map<String, QoSManagerNotificationIF> mapGw,
ReservationResults ris, double hyperperiod,
Map<String, QoSMThingStar> things, Map<String, QoSMAssignmentStar> assignments,
Map<String, QoSMEquivalentThingServiceStar> equivalents, Map<String, QoSMThingServiceStar> thingservices, Map<String, QoSMRequestStar> requests,
Map<String, QoSMAssuredRequestStar> assuredrequests, boolean request_response) {
QoSRankList response = new QoSRankList();
// gw, result
Map<String, QoSRankResults> notifyMap = Utils.createNotifications(assignments, equivalents, thingservices, things);
response.setFeas(true);
response.setHyperperiod(hyperperiod);
if(request_response){
Utils.create_response_for_requester(serviceId, assignments, response);
}
Utils.create_total_assignment_for_involved_gateways(assignments, notifyMap, things, requests, assuredrequests);
response.setNotifyMap(notifyMap);
response.setMapGw(mapGw);
return response;
}
public static void update_batteryLevel(Map<String, QoSMThingStar> mapThing,
Map<String, QoSManagerNotificationIF> mapGw) {
for(QoSManagerNotificationIF gwQoS : mapGw.values()){
//Get battery of all the thing connected to GW gwQoS
Map<String, Double> batteries = gwQoS.getBatteryLevels();
for(String item : batteries.keySet()){
mapThing.get(item).setBatteryLevel(batteries.get(item));
}
}
}
}