package org.gcube.portlets.user.accountingdashboard.server.accounting; import java.util.ArrayList; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.gcube.accounting.accounting.summary.access.AccountingDao; import org.gcube.accounting.accounting.summary.access.model.MeasureResolution; import org.gcube.accounting.accounting.summary.access.model.Report; import org.gcube.accounting.accounting.summary.access.model.ScopeDescriptor; import org.gcube.portlets.user.accountingdashboard.shared.data.ReportData; import org.gcube.portlets.user.accountingdashboard.shared.data.RequestReportData; import org.gcube.portlets.user.accountingdashboard.shared.data.ScopeData; import org.gcube.portlets.user.accountingdashboard.shared.exception.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author Giancarlo Panichi * */ public class AccountingService { private static Logger logger = LoggerFactory.getLogger(AccountingService.class); private AccountingDao dao; public AccountingService(AccountingServiceType accountingServiceType) throws ServiceException { try { if (accountingServiceType == null) { logger.error("Invalid AccountingServiceType requested: null"); } switch (accountingServiceType) { case CurrentScope: logger.debug("AccountingService: CurrentScope"); dao = AccountingDao.get(); break; case PortalContex: logger.debug("AccountingService: PortalContext"); dao = AccountingDao.get(new PortalContextTreeProvider()); break; default: logger.debug("AccountingService: CurrentScope"); dao = AccountingDao.get(); break; } } catch (Throwable e) { logger.error("Error retrieving Tree: " + e.getLocalizedMessage(), e); throw new ServiceException("Error retrieving Tree: " + e.getLocalizedMessage(), e); } } public ScopeData getTree(HttpServletRequest httpServletRequest) throws ServiceException { try { logger.debug("AccountingService GetTree()"); ScopeDescriptor scopeDescriptor = dao.getTree(httpServletRequest); logger.debug("ScopeDescriptor: " + scopeDescriptor); ScopeData scopeData = getScopeData(scopeDescriptor); return scopeData; } catch (Throwable e) { logger.error("Error retrieving Tree: " + e.getLocalizedMessage(), e); throw new ServiceException("Error retrieving Tree: " + e.getLocalizedMessage(), e); } } private ScopeData getScopeData(ScopeDescriptor scopeDescriptor) { ScopeData scopeData = null; if (scopeDescriptor != null) { if (scopeDescriptor.hasChildren()) { ArrayList childs = new ArrayList<>(); for (ScopeDescriptor sd : scopeDescriptor.getChildren()) { childs.add(getScopeData(sd)); } scopeData = new ScopeData(scopeDescriptor.getId(), scopeDescriptor.getName(), childs); } else { scopeData = new ScopeData(scopeDescriptor.getId(), scopeDescriptor.getName(), null); } } return scopeData; } public ReportData getReport(HttpServletRequest httpServletRequest, RequestReportData requestReportData) throws ServiceException { try { logger.debug("AccountingService GetReport(): " + requestReportData); if (requestReportData != null && requestReportData.getScopeData() != null && requestReportData.getScopeData().getId() != null && !requestReportData.getScopeData().getId().isEmpty()) { ScopeDescriptor scopeDescriptor = searchScopeDescriptor(httpServletRequest, requestReportData.getScopeData()); Date dateFrom = requestReportData.getDateFrom(); Date dateTo = requestReportData.getDateTo(); logger.debug("getReportByScope(): [ScopeDescriptor=" + scopeDescriptor + ", dateFrom=" + dateFrom + ", dateTo=" + dateTo + ", measureResolution=" + MeasureResolution.MONTHLY + "]"); Report report = dao.getReportByScope(scopeDescriptor, dateFrom, dateTo, MeasureResolution.MONTHLY); logger.debug("Report: " + report); ReportDataBuilder reportDataBuilder = new ReportDataBuilder(report); ReportData reportData = reportDataBuilder.build(); return reportData; } else { throw new ServiceException("Invalid report request, " + requestReportData); } } catch (Throwable e) { logger.error("Error in crete report: " + e.getLocalizedMessage(), e); throw new ServiceException("Error in create report: " + e.getLocalizedMessage(), e); } } private ScopeDescriptor searchScopeDescriptor(HttpServletRequest httpServletRequest, ScopeData scopeData) throws ServiceException { try { ScopeDescriptor scopeDescriptor = dao.getTree(httpServletRequest); logger.debug("ScopeDescriptor: " + scopeDescriptor); if (scopeDescriptor.getId().compareTo(scopeData.getId()) == 0) { return scopeDescriptor; } else { if (scopeDescriptor.hasChildren()) { return searchScopeDescriptorInChildren(scopeDescriptor, scopeData); } else { return null; } } } catch (Throwable e) { logger.error("Error searching scope descriptor: " + e.getLocalizedMessage(), e); throw new ServiceException("Error searching scope descriptor: " + e.getLocalizedMessage(), e); } } private ScopeDescriptor searchScopeDescriptorInChildren(ScopeDescriptor scopeDescriptor, ScopeData scopeData) throws ServiceException { try { logger.debug("ScopeDescriptor: " + scopeDescriptor); for (ScopeDescriptor child : scopeDescriptor.getChildren()) { if (child.getId().compareTo(scopeData.getId()) == 0) { return child; } else { if (child.hasChildren()) { ScopeDescriptor found = searchScopeDescriptorInChildren(child, scopeData); if (found != null) { return found; } } } } return null; } catch (Throwable e) { logger.error("Error searching scope descriptor: " + e.getLocalizedMessage(), e); throw new ServiceException("Error searching scope descriptor: " + e.getLocalizedMessage(), e); } } }