accounting-manager/src/main/java/org/gcube/portlets/admin/accountingmanager/server/amservice/command/AccountingCommandGetFilterV...

147 lines
5.6 KiB
Java

package org.gcube.portlets.admin.accountingmanager.server.amservice.command;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Set;
import org.gcube.accounting.analytics.Filter;
import org.gcube.accounting.analytics.NumberedFilter;
import org.gcube.accounting.analytics.TemporalConstraint;
import org.gcube.accounting.analytics.persistence.AccountingPersistenceQuery;
import org.gcube.accounting.analytics.persistence.AccountingPersistenceQueryFactory;
import org.gcube.accounting.datamodel.aggregation.AggregatedJobUsageRecord;
import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord;
import org.gcube.accounting.datamodel.aggregation.AggregatedStorageStatusRecord;
import org.gcube.accounting.datamodel.aggregation.AggregatedStorageUsageRecord;
import org.gcube.portlets.admin.accountingmanager.server.amservice.PeriodModeMap;
import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValue;
import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesRequest;
import org.gcube.portlets.admin.accountingmanager.shared.data.FilterValuesResponse;
import org.gcube.portlets.admin.accountingmanager.shared.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Giancarlo Panichi
*
*
*/
public class AccountingCommandGetFilterValues implements AccountingCommand<FilterValuesResponse> {
private static final Logger logger = LoggerFactory.getLogger(AccountingCommandGetFilterValues.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy MMMMM dd");
private FilterValuesRequest filterValuesRequest;
public AccountingCommandGetFilterValues(FilterValuesRequest filterValuesRequest) {
this.filterValuesRequest = filterValuesRequest;
}
@Override
public FilterValuesResponse execute() throws ServiceException {
try {
logger.debug("getFilterValue(): [FilterValueRequest=" + filterValuesRequest + "]");
FilterValuesResponse filterValuesResponse = null;
if (filterValuesRequest == null || filterValuesRequest.getAccountingType() == null
|| filterValuesRequest.getFilterKey() == null) {
filterValuesResponse = new FilterValuesResponse(new ArrayList<FilterValue>());
return filterValuesResponse;
}
ArrayList<FilterValue> filterValues = new ArrayList<FilterValue>();
Set<NumberedFilter> values;
AccountingPersistenceQuery apq = AccountingPersistenceQueryFactory.getInstance();
Calendar startCalendar = GregorianCalendar.getInstance(TemporalConstraint.DEFAULT_TIME_ZONE);
try {
startCalendar.setTime(sdf.parse(filterValuesRequest.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(filterValuesRequest.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 tc = new TemporalConstraint(startCalendar.getTimeInMillis(),
endCalendar.getTimeInMillis(),
PeriodModeMap.getMode(filterValuesRequest.getAccountingPeriod().getPeriod()));
List<Filter> filters = new ArrayList<>();
switch (filterValuesRequest.getAccountingType()) {
case JOB:
apq.setRequestedRecords(AggregatedJobUsageRecord.class);
apq.setTemporalConstraint(tc);
apq.setFilters(filters);
values = apq.getFilterValues(filterValuesRequest.getFilterKey().getKey());
break;
case PORTLET:
// values = rrq.getPossibleValuesForKey(
// AggregatedPortletUsageRecord.class, filterValuesRequest
// .getFilterKey().getKey());
filterValuesResponse = new FilterValuesResponse(filterValues);
return filterValuesResponse;
case SERVICE:
apq.setRequestedRecords(AggregatedServiceUsageRecord.class);
apq.setTemporalConstraint(tc);
apq.setFilters(filters);
values = apq.getFilterValues(filterValuesRequest.getFilterKey().getKey());
break;
case STORAGE:
apq.setRequestedRecords(AggregatedStorageUsageRecord.class);
apq.setTemporalConstraint(tc);
apq.setFilters(filters);
values = apq.getFilterValues(filterValuesRequest.getFilterKey().getKey());
break;
case TASK:
// values = rrq.getPossibleValuesForKey(
// AggregatedTaskUsageRecord.class, filterValuesRequest
// .getFilterKey().getKey());
filterValuesResponse = new FilterValuesResponse(filterValues);
return filterValuesResponse;
case SPACE:
apq.setRequestedRecords(AggregatedStorageStatusRecord.class);
apq.setTemporalConstraint(tc);
apq.setFilters(filters);
values = apq.getFilterValues(filterValuesRequest.getFilterKey().getKey());
break;
default:
filterValuesResponse = new FilterValuesResponse(filterValues);
return filterValuesResponse;
}
for (NumberedFilter value : values) {
if (value != null) {
filterValues.add(new FilterValue(value.getValue()));
}
}
filterValuesResponse = new FilterValuesResponse(filterValues);
return filterValuesResponse;
} catch (Throwable e) {
logger.error("Error in AccountingCommandGetFilterValues(): " + e.getLocalizedMessage());
e.printStackTrace();
throw new ServiceException("No values available!");
}
}
}