/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.pieShare.pieShareApp.service.requestService; import java.util.concurrent.ConcurrentHashMap; import org.pieShare.pieShareApp.model.PieShareAppBeanNames; import org.pieShare.pieShareApp.model.PieUser; import org.pieShare.pieShareApp.model.message.api.IFileRequestMessage; import org.pieShare.pieShareApp.model.pieFile.PieFile; import org.pieShare.pieShareApp.service.comparerService.api.ILocalFileCompareService; import org.pieShare.pieShareApp.service.factoryService.IMessageFactoryService; import org.pieShare.pieShareApp.service.requestService.api.IRequestService; import org.pieShare.pieTools.piePlate.service.cluster.api.IClusterManagementService; import org.pieShare.pieTools.piePlate.service.cluster.exception.ClusterManagmentServiceException; import org.pieShare.pieTools.pieUtilities.service.beanService.IBeanService; import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger; /** * * @author Richard */ public class RequestService implements IRequestService { private IBeanService beanService; private IClusterManagementService clusterManagementService; private final ConcurrentHashMap<PieFile, Boolean> requestedFiles; private IMessageFactoryService messageFactoryService; private ILocalFileCompareService comparerService; public RequestService() { requestedFiles = new ConcurrentHashMap<>(); } public void setMessageFactoryService(IMessageFactoryService messageFactoryService) { this.messageFactoryService = messageFactoryService; } public void setClusterManagementService(IClusterManagementService clusterManagementService) { this.clusterManagementService = clusterManagementService; } public void setBeanService(IBeanService beanService) { this.beanService = beanService; } @Override public synchronized void requestFile(PieFile pieFile) { if (this.isRequested(pieFile)) { PieLogger.info(this.getClass(), "File allready requested {}", pieFile.getFileName()); return; } //todo: who is responsible for sending the messages? the service or the task? //i belive the task IFileRequestMessage msg = this.messageFactoryService.getFileRequestMessage(); PieUser user = this.beanService.getBean(PieShareAppBeanNames.getPieUser()); msg.getAddress().setClusterName(user.getCloudName()); msg.getAddress().setChannelId(user.getUserName()); msg.setPieFile(pieFile); try { PieLogger.info(this.getClass(), "Sending message to cluster {}", user.getCloudName()); clusterManagementService.sendMessage(msg); requestedFiles.put(pieFile, false); } catch (ClusterManagmentServiceException ex) { PieLogger.error(this.getClass(), "Error sending RequestMessage.", ex); } } //todo: is this really needed? @Override public synchronized boolean handleRequest(PieFile file) { return this.handleRequest(file, false); } @Override public synchronized boolean handleRequest(PieFile file, boolean force) { if (this.isRequested(file)) { if (!requestedFiles.get(file)) { requestedFiles.replace(file, true); return true; } } else { if (force) { requestedFiles.put(file, true); return true; } } return false; } @Override public synchronized boolean isRequested(PieFile file) { if (requestedFiles.containsKey(file)) { return true; } return false; } /** * If this client is in a process of getting a new file and another client * requests the very same file from us we want to keep our seeder open so we * notify the shareService about it. * * @param pieFile */ /*@Override public synchronized void checkForActiveFileHandle(PieFile pieFile) { if (requestedFiles.containsKey(pieFile) && requestedFiles.get(pieFile).equals(true)) { return true; } }*/ @Override public synchronized boolean deleteRequestedFile(PieFile pieFile) { if (this.isRequested(pieFile)) { requestedFiles.remove(pieFile); return true; } return false; } }