/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jclouds.abiquo.internal;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.getFirst;
import static org.jclouds.abiquo.domain.DomainWrapper.wrap;
import java.util.Collection;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.abiquo.AbiquoApi;
import org.jclouds.abiquo.domain.config.CostCode;
import org.jclouds.abiquo.domain.config.CostCodeCurrency;
import org.jclouds.abiquo.domain.config.Currency;
import org.jclouds.abiquo.domain.config.PricingCostCode;
import org.jclouds.abiquo.domain.config.PricingTemplate;
import org.jclouds.abiquo.domain.config.PricingTier;
import org.jclouds.abiquo.features.services.PricingService;
import org.jclouds.rest.ApiContext;
import com.abiquo.server.core.pricing.CostCodeCurrenciesDto;
import com.abiquo.server.core.pricing.CostCodeDto;
import com.abiquo.server.core.pricing.CostCodesDto;
import com.abiquo.server.core.pricing.CurrenciesDto;
import com.abiquo.server.core.pricing.CurrencyDto;
import com.abiquo.server.core.pricing.PricingCostCodeDto;
import com.abiquo.server.core.pricing.PricingCostCodesDto;
import com.abiquo.server.core.pricing.PricingTemplateDto;
import com.abiquo.server.core.pricing.PricingTemplatesDto;
import com.abiquo.server.core.pricing.PricingTierDto;
import com.abiquo.server.core.pricing.PricingTiersDto;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
/**
* Provides access to Abiquo pricing features.
*
* @author Ignasi Barrera
* @author Susana Acedo
*/
@Singleton
public class BasePricingService implements PricingService {
@VisibleForTesting
protected ApiContext<AbiquoApi> context;
@Inject
protected BasePricingService(final ApiContext<AbiquoApi> context) {
this.context = checkNotNull(context, "context");
}
/*********************** Currency ********************** */
@Override
public Iterable<Currency> listCurrencies() {
CurrenciesDto result = context.getApi().getPricingApi().listCurrencies();
return wrap(context, Currency.class, result.getCollection());
}
@Override
public Iterable<Currency> listCurrencies(final Predicate<Currency> filter) {
return filter(listCurrencies(), filter);
}
@Override
public Currency findCurrency(final Predicate<Currency> filter) {
return getFirst(listCurrencies(filter), null);
}
@Override
public Currency getCurrency(final Integer currencyId) {
CurrencyDto result = context.getApi().getPricingApi().getCurrency(currencyId);
return wrap(context, Currency.class, result);
}
/*********************** CostCode ********************** */
@Override
public Iterable<CostCode> listCostCodes() {
CostCodesDto result = context.getApi().getPricingApi().listCostCodes();
return wrap(context, CostCode.class, result.getCollection());
}
@Override
public Iterable<CostCode> listCostCodes(final Predicate<CostCode> filter) {
return filter(listCostCodes(), filter);
}
@Override
public CostCode findCostCode(final Predicate<CostCode> filter) {
return Iterables.getFirst(listCostCodes(filter), null);
}
@Override
public CostCode getCostCode(Integer costCodeId) {
CostCodeDto result = context.getApi().getPricingApi().getCostCode(costCodeId);
return wrap(context, CostCode.class, result);
}
/*********************** PricingTemplate ********************** */
@Override
public Iterable<PricingTemplate> listPricingTemplates() {
PricingTemplatesDto result = context.getApi().getPricingApi().listPricingTemplates();
return wrap(context, PricingTemplate.class, result.getCollection());
}
@Override
public Iterable<PricingTemplate> listPricingTemplates(final Predicate<PricingTemplate> filter) {
return filter(listPricingTemplates(), filter);
}
@Override
public PricingTemplate findPricingTemplate(final Predicate<PricingTemplate> filter) {
return getFirst(listPricingTemplates(filter), null);
}
@Override
public PricingTemplate getPricingTemplate(Integer pricingTemplateId) {
PricingTemplateDto result = context.getApi().getPricingApi().getPricingTemplate(pricingTemplateId);
return wrap(context, PricingTemplate.class, result);
}
/*********************** CostCodeCurrency ********************** */
@Override
public Iterable<CostCodeCurrency> getCostCodeCurrencies(final Integer costcodeId, final Integer currencyId) {
CostCodeCurrenciesDto result = context.getApi().getPricingApi().getCostCodeCurrencies(costcodeId, currencyId);
return wrap(context, CostCodeCurrency.class, result.getCollection());
}
/*********************** Pricing Cost Code ********************** */
@Override
public Collection<PricingCostCode> getPricingCostCodes(final Integer pricingTemplateId) {
PricingCostCodesDto result = context.getApi().getPricingApi().getPricingCostCodes(pricingTemplateId);
return wrap(context, PricingCostCode.class, result.getCollection());
}
@Override
public PricingCostCode getPricingCostCode(final Integer pricingTemplateId, final Integer pricingCostCodeId) {
PricingCostCodeDto pricingcostcode = context.getApi().getPricingApi()
.getPricingCostCode(pricingTemplateId, pricingCostCodeId);
return wrap(context, PricingCostCode.class, pricingcostcode);
}
/*********************** Pricing Tier********************** */
@Override
public Collection<PricingTier> getPricingTiers(final Integer pricingTemplateId) {
PricingTiersDto result = context.getApi().getPricingApi().getPricingTiers(pricingTemplateId);
return wrap(context, PricingTier.class, result.getCollection());
}
@Override
public PricingTier getPricingTier(final Integer pricingTemplateId, final Integer pricingTierId) {
PricingTierDto pricingtier = context.getApi().getPricingApi().getPricingTier(pricingTemplateId, pricingTierId);
return wrap(context, PricingTier.class, pricingtier);
}
}