package org.gcube.portlets.admin.accountingmanager.server.amservice.query; import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import org.gcube.accounting.analytics.Filter; import org.gcube.accounting.analytics.TemporalConstraint; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; import org.gcube.portlets.admin.accountingmanager.server.amservice.PeriodModeMap; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilter; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterBasic; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterContext; import org.gcube.portlets.admin.accountingmanager.shared.data.AccountingFilterTop; import org.gcube.portlets.admin.accountingmanager.shared.data.query.SeriesRequest; import org.gcube.portlets.admin.accountingmanager.shared.exception.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Accounting Query 4 Service * * @author Giancarlo Panichi * * */ public class AccountingQuery4Service extends AccountingQueryBuilder { protected static Logger logger = LoggerFactory .getLogger(AccountingQuery4Service.class); private SeriesRequest seriesRequest; public AccountingQuery4Service(SeriesRequest seriesRequest) { this.seriesRequest = seriesRequest; } @Override public void buildOpEx() throws ServiceException { Calendar startCalendar = GregorianCalendar .getInstance(TemporalConstraint.DEFAULT_TIME_ZONE); try { startCalendar.setTime(sdf.parse(seriesRequest.getAccountingPeriod() .getStartDate())); } catch (ParseException e) { e.printStackTrace(); throw new ServiceException("Start Date not valid!"); } Calendar endCalendar = GregorianCalendar .getInstance(TemporalConstraint.DEFAULT_TIME_ZONE); try { endCalendar.setTime(sdf.parse(seriesRequest.getAccountingPeriod() .getEndDate())); } catch (ParseException e) { e.printStackTrace(); throw new ServiceException("End Date not valid!"); } endCalendar.set(GregorianCalendar.HOUR_OF_DAY, 23); endCalendar.set(GregorianCalendar.MINUTE, 59); endCalendar.set(GregorianCalendar.SECOND, 59); endCalendar.set(GregorianCalendar.MILLISECOND, 999); TemporalConstraint temporalConstraint = new TemporalConstraint( startCalendar.getTimeInMillis(), endCalendar.getTimeInMillis(), PeriodModeMap.getMode(seriesRequest.getAccountingPeriod() .getPeriod())); ArrayList filters = null; ArrayList accountingFilters = null; AccountingQuery invocation = null; if (seriesRequest != null && seriesRequest.getAccountingFilterDefinition() != null) { if (seriesRequest.getAccountingFilterDefinition() instanceof AccountingFilterBasic) { AccountingFilterBasic accountingFilterBasic = (AccountingFilterBasic) seriesRequest .getAccountingFilterDefinition(); accountingFilters = accountingFilterBasic.getFilters(); filters = new ArrayList(); if (accountingFilters != null) { for (AccountingFilter accountigFilters : accountingFilters) { Filter filter = new Filter(accountigFilters .getFilterKey().getKey(), accountigFilters.getFilterValue()); filters.add(filter); } } invocation = new AccountingQueryBasic( AggregatedServiceUsageRecord.class, temporalConstraint, filters, accountingFilterBasic.isNoContext()); } else { if (seriesRequest.getAccountingFilterDefinition() instanceof AccountingFilterTop) { AccountingFilterTop accountingFilterTop = (AccountingFilterTop) seriesRequest .getAccountingFilterDefinition(); accountingFilters = accountingFilterTop.getFilters(); filters = new ArrayList(); if (accountingFilters != null) { for (AccountingFilter accountigFilters : accountingFilters) { Filter filter = new Filter(accountigFilters .getFilterKey().getKey(), accountigFilters.getFilterValue()); filters.add(filter); } } invocation = new AccountingQueryTop( AggregatedServiceUsageRecord.class, accountingFilterTop.getFilterKey(), accountingFilterTop.getShowOthers(), accountingFilterTop.getTopNumber(), temporalConstraint, filters); } else { if (seriesRequest.getAccountingFilterDefinition() instanceof AccountingFilterContext) { AccountingFilterContext accountingFilterContext = (AccountingFilterContext) seriesRequest .getAccountingFilterDefinition(); accountingFilters = accountingFilterContext.getFilters(); filters = new ArrayList(); if (accountingFilters != null) { for (AccountingFilter accountigFilters : accountingFilters) { Filter filter = new Filter(accountigFilters .getFilterKey().getKey(), accountigFilters.getFilterValue()); filters.add(filter); } } invocation = new AccountingQueryContext( AggregatedServiceUsageRecord.class, accountingFilterContext.getContext(), temporalConstraint, filters); } else { logger.error("Invalid Request: " + seriesRequest); throw new ServiceException( "Invalid Request!"); } } } } else { logger.error("Invalid Request: " + seriesRequest); throw new ServiceException("Invalid Request!"); } accountingQuerySpec.setOp(invocation); } }