org.opendaylight.alto.basic.endpointcostservice.impl.base.BaseECSImplementation.java Source code

Java tutorial

Introduction

Here is the source code for org.opendaylight.alto.basic.endpointcostservice.impl.base.BaseECSImplementation.java

Source

/*
 * Copyright  2015 Yale University and others.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */
package org.opendaylight.alto.basic.endpointcostservice.impl.base;

import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.core.types.rev150921.CostTypeData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.QueryOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.ResourceTypeEndpointcost;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.alto.request.endpointcost.request.EndpointcostRequest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.alto.response.endpointcost.response.EndpointcostResponseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rev151021.endpointcost.request.data.EndpointcostParams;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.TypedAddressData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpoint.filter.data.EndpointFilter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.EndpointCostMapBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.EndpointCost;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.EndpointCostBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.Cost;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.DestinationBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.endpointcostmap.response.data.endpoint.cost.map.endpoint.cost.SourceBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.input.request.endpointcost.request.endpointcost.params.filter.EndpointFilterData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.model.endpointcost.rfc7285.rev151021.query.output.response.endpointcost.response.endpointcost.data.EndpointCostmapDataBuilder;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;

import java.util.ArrayList;
import java.util.List;

public abstract class BaseECSImplementation {
    protected DataBroker dataBroker;
    private RpcResult<QueryOutput> ecsOutput;

    protected EndpointcostRequest request;
    protected EndpointcostParams params;
    protected CostTypeData costType;
    protected EndpointFilter filter;

    public ListenableFuture<RpcResult<QueryOutput>> getECS(QueryInput input) {
        if (checkInput(input) && postCheck(input)) {
            buildEndpointCostServiceOutput(input);
        }
        return Futures.immediateFuture(ecsOutput);
    }

    private void buildEndpointCostServiceOutput(QueryInput input) {
        request = (EndpointcostRequest) input.getRequest();
        params = request.getEndpointcostParams();
        costType = params.getCostType();
        filter = ((EndpointFilterData) params.getFilter()).getEndpointFilter();
        List<EndpointCost> ecmList = buildEndpointCostMapList(filter.getSource(), filter.getDestination(),
                costType);
        buildEndpointCostServiceOutput(ecmList);
    }

    private void buildEndpointCostServiceOutput(List<EndpointCost> ecmList) {
        EndpointCostMapBuilder endpointCostMapBuilder = new EndpointCostMapBuilder().setEndpointCost(ecmList);
        EndpointCostmapDataBuilder endpointCostmapDataBuilder = new EndpointCostmapDataBuilder()
                .setEndpointCostMap(endpointCostMapBuilder.build());
        EndpointcostResponseBuilder endpointcostResponseBuilder = new EndpointcostResponseBuilder()
                .setEndpointcostData(endpointCostmapDataBuilder.build());
        QueryOutputBuilder queryOutputBuilder = new QueryOutputBuilder()
                .setResponse(endpointcostResponseBuilder.build()).setType(ResourceTypeEndpointcost.class);
        if (queryOutputBuilder != null) {
            this.ecsOutput = RpcResultBuilder.success(queryOutputBuilder).build();
        } else {
            this.ecsOutput = buildErrorRpcResult("Invalid output value ", "output is null");
        }
    }

    private List<EndpointCost> buildEndpointCostMapList(List<? extends TypedAddressData> source,
            List<? extends TypedAddressData> destination, CostTypeData costType) {
        List<EndpointCost> ecmList = new ArrayList<EndpointCost>();
        for (TypedAddressData src : source) {
            for (TypedAddressData dst : destination) {
                Cost cost = getCost(src, dst, costType);
                ecmList.add(buildEndpointCost(src, dst, cost));
            }
        }
        //TODO  operate oridinal
        return ecmList;
    }

    private EndpointCost buildEndpointCost(TypedAddressData src, TypedAddressData dst, Cost cost) {
        EndpointCost endpointCost = null;
        SourceBuilder sourceBuilder = new SourceBuilder();
        DestinationBuilder destinationBuilder = new DestinationBuilder();
        endpointCost = new EndpointCostBuilder().setCost(cost)
                .setSource(sourceBuilder.setAddress(src.getAddress()).build())
                .setDestination(destinationBuilder.setAddress(dst.getAddress()).build()).build();
        return endpointCost;
    }

    private Cost getCost(TypedAddressData src, TypedAddressData dst, CostTypeData costType) {
        if (validSrcDstIpPair(src, dst)) {
            return computeCost(src, dst, costType);
        }
        return null;
    }

    protected abstract Cost computeCost(TypedAddressData src, TypedAddressData dst, CostTypeData costType);

    private boolean validSrcDstIpPair(TypedAddressData src, TypedAddressData dst) {
        return true;
    }

    /**
     * @param input is the input of ECS.
     * @return true if input is validate.
     */
    public boolean checkInput(QueryInput input) {
        request = (EndpointcostRequest) input.getRequest();
        params = request.getEndpointcostParams();
        costType = params.getCostType();
        filter = ((EndpointFilterData) params.getFilter()).getEndpointFilter();

        if (costType == null) {
            ecsOutput = buildErrorRpcResult("Invalid cost-type value ", "CostType is null");
            return false;
        }
        if (!(params.getFilter() instanceof EndpointFilterData) || filter == null) {
            ecsOutput = buildErrorRpcResult("Invalid endpoints value ", "Endpoints is null");
            return false;
        }
        return true;
    }

    protected boolean postCheck(QueryInput input) {
        return true;
    }

    /**
     * @param errorCode
     * @param errorMessage
     * @return built RPC error result.
     */
    protected RpcResult<QueryOutput> buildErrorRpcResult(String errorCode, String errorMessage) {
        return RpcResultBuilder.<QueryOutput>failed()
                .withError(RpcError.ErrorType.APPLICATION, errorCode, errorMessage).build();
    }
}