package edu.asu.spring.quadriga.service.network.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import javax.xml.bind.JAXBException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import edu.asu.spring.quadriga.domain.impl.networks.ElementEventsType;
import edu.asu.spring.quadriga.domain.network.INetworkNodeInfo;
import edu.asu.spring.quadriga.exceptions.QStoreStorageException;
/**
* Created by Vikranth on 4/15/2016.
*/
@Service
public class NetworkDownloadService {
@Autowired
private ElementEventTypeDownloadService elementEventTypeDownloadService;
private static final Logger logger = LoggerFactory
.getLogger(NetworkDownloadService.class);
/**
* Return ElementEventsType asynchronously
* @param networkNodeInfoList List of networks
* @return elementEventsTypeList
*/
public List<ElementEventsType> getElementEventTypes(
final List<INetworkNodeInfo> networkNodeInfoList) {
List<Future<ElementEventsType>> futureEvents = new ArrayList<>();
networkNodeInfoList.forEach(networkNodeInfo -> {
// adding future tasks to a list
// this is asynchronous
Future<ElementEventsType> future = elementEventTypeDownloadService
.getElementEventTypeAsync(networkNodeInfo.getId());
futureEvents.add(future);
});
// Get the data from future tasks
List<ElementEventsType> elementEventsTypeList = new ArrayList<>();
int index = 0;
for (INetworkNodeInfo networkNodeInfo: networkNodeInfoList) {
Future<ElementEventsType> future = futureEvents.get(index++);
ElementEventsType elementEventsType = null;
try {
elementEventsType = future.get();
} catch (InterruptedException | ExecutionException e) {
logger.error("Unable to execute a qstore asynchronosly for relation event id: " +
networkNodeInfo.getId(), e);
} finally {
// add element event type in the list even if it is null
elementEventsTypeList.add(elementEventsType);
}
}
return elementEventsTypeList;
}
}