/** * Revenue Settlement and Sharing System GE * Copyright (C) 2011-2014, Javier Lucio - lucio@tid.es * Telefonica Investigacion y Desarrollo, S.A. * * Copyright (C) 2015, CoNWeT Lab., Universidad Politécnica de Madrid * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package es.upm.fiware.rss.expenditureLimit.server.service; import es.upm.fiware.rss.common.properties.AppProperties; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import es.upm.fiware.rss.dao.CurrencyDao; import es.upm.fiware.rss.dao.DbeAppProviderDao; import es.upm.fiware.rss.dao.ServiceDao; import es.upm.fiware.rss.dao.UserDao; import es.upm.fiware.rss.exception.RSSException; import es.upm.fiware.rss.exception.UNICAExceptionType; import es.upm.fiware.rss.expenditureLimit.api.LimitBean; import es.upm.fiware.rss.model.BmCurrency; import es.upm.fiware.rss.model.BmService; import es.upm.fiware.rss.model.DbeAppProvider; import es.upm.fiware.rss.model.RSUser; import es.upm.fiware.rss.model.Role; import java.util.Iterator; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.transaction.annotation.Transactional; /** * */ @Service @Transactional public class ExpenditureLimitDataChecker { /** * Variable to print the trace. */ private static Logger logger = LoggerFactory.getLogger(ExpenditureLimitDataChecker.class); @Autowired private CurrencyDao currencyDao; @Autowired private ServiceDao serviceDao; @Autowired private DbeAppProviderDao dbeAppProviderDao; @Autowired private UserDao userDao; @Autowired @Qualifier(value = "oauthProperties") private AppProperties oauthProperties; /** * */ // Default ob-country public static final long countryId = 1; public static final long obId = 1; // public static final String monthly = "monthly"; public static final String daily = "daily"; public static final String weekly = "weekly"; public static final String perTransaction = "perTransaction"; /** * Check the userId existence. * * @param datum * @throws RSSException */ public void checkMandatoryDatumExistence(String datum, String datumName) throws RSSException { ExpenditureLimitDataChecker.logger.debug("Accessing checkEndUserId.."); if ((datum == null) || (datum.trim().length() == 0)) { String[] args = {datumName}; throw new RSSException(UNICAExceptionType.MISSING_MANDATORY_PARAMETER, args); } } /** * Make basic checks over expenditure limit data. * The controls are: * - Exists type and currency * - No notification limit exceed the amount limit. * * @param expLimitBean */ public void checkExpLimitData(LimitBean expLimitBean) throws RSSException { if (expLimitBean != null) { checkMandatoryDatumExistence(expLimitBean.getType(), "Limit type"); checkMandatoryDatumExistence(expLimitBean.getCurrency(), "Limit Currency"); checkCurrency(expLimitBean.getCurrency()); checkNotificationLimits(expLimitBean.getMaxAmount().longValue(), expLimitBean.getNotificationAmounts()); } else { String[] args = {"Currency and Type"}; throw new RSSException(UNICAExceptionType.MISSING_MANDATORY_PARAMETER, args); } } /** * * @param maxAmount * @param defaultProvThresholds */ private void checkNotificationLimits(Long maxAmount, List<Long> sNotifAmounts) throws RSSException { if ((maxAmount > 0) && (sNotifAmounts != null) && (sNotifAmounts.size() > 0)) { ListIterator<Long> litr = sNotifAmounts.listIterator(); while (litr.hasNext()) { long notifAmount = litr.next().longValue(); if (notifAmount > maxAmount) { String[] args = {"Amount notification (" + notifAmount + ") is greather than total limit (" + maxAmount + ")"}; throw new RSSException(UNICAExceptionType.INVALID_INPUT_VALUE, args); } } } } /** * Get value numbers from String * * @param sNotifAmounts * @return */ public List<Long> getNumberAmounts(String sNotifAmounts) { if (null != sNotifAmounts && sNotifAmounts.trim().length() > 0) { if (sNotifAmounts.startsWith("[")) { sNotifAmounts = sNotifAmounts.substring(1); } if (sNotifAmounts.trim().endsWith("]")) { sNotifAmounts = sNotifAmounts.substring(0, sNotifAmounts.lastIndexOf("]")); } String[] values = sNotifAmounts.split(","); if (values != null && values.length > 0) { List<Long> listValues = new ArrayList<Long>(); Long limit; for (String value : values) { try { limit = new Long(value.trim()); listValues.add(limit); } catch (Exception e) { } } return listValues; } } return null; } /** * Get String from value numbers * * @param sNotifAmounts * @return */ public String getStringFromLisAmounts(List<Long> sNotifAmounts) { String result = ""; if (null != sNotifAmounts && sNotifAmounts.size() > 0) { result = "["; for (Long amount : sNotifAmounts) { result = result + amount.toString() + ','; } result = result.substring(0, result.length() - 2); result += "]"; return result; } return null; } /** * Verify and get the currency. * * @param currency * @return */ public BmCurrency checkCurrency(String userCurrency) throws RSSException { BmCurrency currency = currencyDao.getByIso4217StringCode(userCurrency); if (null == currency) { String[] args = {"Currency Not found."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } return currency; } /** * Verify and get the service. * * @param service * @return * @throws RSSException */ /*public BmService checkService(String serviceName) throws RSSException { BmService service = serviceDao.getServiceByName(serviceName); if (null == service) { String[] args = {"Service Not found."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } return service; }*/ /** * Verify and get the DbeAppProvider. * * @param appProviderId, Id of the provider * @param aggregatorId , Id of the given aggregator * @return */ public DbeAppProvider checkDbeAppProvider(String aggregatorId, String appProviderId) throws RSSException { DbeAppProvider appProvider = dbeAppProviderDao.getProvider(aggregatorId, appProviderId); if (null == appProvider) { String[] args = {"AppProvider Not found."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } return appProvider; } /** * Verify El type. * * @param eltype * @return */ public void checkElType(String eltype) throws RSSException { if (null != eltype && !ExpenditureLimitDataChecker.monthly.equalsIgnoreCase(eltype) && !ExpenditureLimitDataChecker.daily.equalsIgnoreCase(eltype) && !ExpenditureLimitDataChecker.weekly.equalsIgnoreCase(eltype)) { String[] args = {"eltype Not found."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } } /** * Verify charge type. * * @param chargeType * @return */ public void checkChargeType(String chargeType) throws RSSException { if (!"R".equalsIgnoreCase(chargeType) && !"C".equalsIgnoreCase(chargeType)) { String[] args = {"chageType Not found."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } } /** * * @param urlEndUserId * @param appPorviderId * @param currency * @throws RSSException */ public void checkChargeRequiredParameters( String urlEndUserId, String service, String aggregator, String appPorviderId, String currency, String chargeType, BigDecimal amount) throws RSSException { if (null == urlEndUserId || urlEndUserId.trim().isEmpty() || null == service || service.trim().isEmpty() || null == aggregator || aggregator.trim().isEmpty() || null == appPorviderId || appPorviderId.trim().isEmpty() || null == currency || currency.trim().isEmpty() || null == chargeType || chargeType.trim().isEmpty() || null == amount || amount.compareTo(new BigDecimal(0)) < 1) { String[] args = {"Required parameters not found:enUserId, service, aggregator, appProvider, currency, chargeType, amount."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } } /** * Check required information * * @param urlEndUserId * @param appPorviderId * @param currency */ public void checkRequiredParameters( String service, String urlEndUserId, String aggregator, String appPorviderId, String currency) throws RSSException { if (null == urlEndUserId || urlEndUserId.trim().isEmpty() || null == service || service.trim().isEmpty() || null == aggregator || aggregator.trim().isEmpty() || null == appPorviderId || appPorviderId.trim().isEmpty() || null == currency || currency.trim().isEmpty()) { String[] args = {"Required parameters not found:enUserId, service, appProvider, currency."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } } /** * Check required information * * @param aggregator * @param service * @param urlEndUserId * @param appPorviderId */ public void checkRequiredSearchParameters( String service, String urlEndUserId, String aggregator, String appPorviderId) throws RSSException { if (null == urlEndUserId || urlEndUserId.trim().isEmpty() || null == service || service.trim().isEmpty() || null == aggregator || aggregator.trim().isEmpty() || null == appPorviderId || appPorviderId.trim().isEmpty()) { String[] args = {"Required parameters not found:endUserId, service, aggregator, appProvider."}; throw new RSSException(UNICAExceptionType.NON_EXISTENT_RESOURCE_ID, args); } } public void checkCurrentUserPermissions() throws RSSException { boolean found = false; RSUser user = userDao.getCurrentUser(); String adminRole = oauthProperties.getProperty("config.grantedRole"); Iterator<Role> rolesIt = user.getRoles().iterator(); // If the user is admin or an aggregator, is authorized while (!found && rolesIt.hasNext()) { String role = rolesIt.next().getName(); if (role.equalsIgnoreCase(adminRole) || role.equalsIgnoreCase("aggregator")) { found = true; } } // No allowed role has been found if (!found) { String[] args = {"The user is not authorized to retrieve ecpenditure limits"}; throw new RSSException(UNICAExceptionType.NON_ALLOWED_OPERATION, args); } } }