Search in sources :

Example 16 with Client

use of io.apiman.gateway.engine.beans.Client in project apiman by apiman.

the class InMemoryRegistry method getContract.

/**
 * @see io.apiman.gateway.engine.IRegistry#getContract(java.lang.String, java.lang.String, java.lang.String, java.lang.String, io.apiman.gateway.engine.async.IAsyncResultHandler)
 */
@Override
public void getContract(String apiOrganizationId, String apiId, String apiVersion, String apiKey, IAsyncResultHandler<ApiContract> handler) {
    Client client = null;
    Api api = null;
    String apiIdx = getApiIndex(apiOrganizationId, apiId, apiVersion);
    synchronized (mutex) {
        client = (Client) getMap().get(apiKey);
        api = (Api) getMap().get(apiIdx);
    }
    if (client == null) {
        // $NON-NLS-1$
        Exception error = new ClientNotFoundException(Messages.i18n.format("InMemoryRegistry.NoClientForAPIKey", apiKey));
        handler.handle(AsyncResultImpl.create(error, ApiContract.class));
        return;
    }
    if (api == null) {
        Exception error = new ApiRetiredException(// $NON-NLS-1$
        Messages.i18n.format(// $NON-NLS-1$
        "InMemoryRegistry.ApiWasRetired", apiId, apiOrganizationId));
        handler.handle(AsyncResultImpl.create(error, ApiContract.class));
        return;
    }
    Contract matchedContract = null;
    for (Contract contract : client.getContracts()) {
        if (contract.matches(apiOrganizationId, apiId, apiVersion)) {
            matchedContract = contract;
            break;
        }
    }
    if (matchedContract == null) {
        Exception error = new NoContractFoundException(// $NON-NLS-1$
        Messages.i18n.format(// $NON-NLS-1$
        "InMemoryRegistry.NoContractFound", client.getClientId(), api.getApiId()));
        handler.handle(AsyncResultImpl.create(error, ApiContract.class));
        return;
    }
    ApiContract contract = new ApiContract(api, client, matchedContract.getPlan(), matchedContract.getPolicies());
    handler.handle(AsyncResultImpl.create(contract));
}
Also used : NoContractFoundException(io.apiman.gateway.engine.beans.exceptions.NoContractFoundException) ApiRetiredException(io.apiman.gateway.engine.beans.exceptions.ApiRetiredException) ClientNotFoundException(io.apiman.gateway.engine.beans.exceptions.ClientNotFoundException) Api(io.apiman.gateway.engine.beans.Api) Client(io.apiman.gateway.engine.beans.Client) Contract(io.apiman.gateway.engine.beans.Contract) ApiContract(io.apiman.gateway.engine.beans.ApiContract) RegistrationException(io.apiman.gateway.engine.beans.exceptions.RegistrationException) ClientNotFoundException(io.apiman.gateway.engine.beans.exceptions.ClientNotFoundException) ApiRetiredException(io.apiman.gateway.engine.beans.exceptions.ApiRetiredException) NoContractFoundException(io.apiman.gateway.engine.beans.exceptions.NoContractFoundException) ApiNotFoundException(io.apiman.gateway.engine.beans.exceptions.ApiNotFoundException) ApiContract(io.apiman.gateway.engine.beans.ApiContract)

Example 17 with Client

use of io.apiman.gateway.engine.beans.Client in project apiman by apiman.

the class InMemoryRegistry method unregisterClientInternal.

/**
 * @param client
 * @param silent
 */
protected void unregisterClientInternal(Client client, boolean silent) throws RegistrationException {
    synchronized (mutex) {
        String clientIdx = getClientIndex(client);
        Client oldClient = (Client) getMap().remove(clientIdx);
        if (oldClient == null) {
            if (!silent) {
                // $NON-NLS-1$
                throw new ClientNotFoundException(Messages.i18n.format("InMemoryRegistry.ClientNotFound"));
            }
        } else {
            getMap().remove(oldClient.getApiKey());
        }
    }
}
Also used : ClientNotFoundException(io.apiman.gateway.engine.beans.exceptions.ClientNotFoundException) Client(io.apiman.gateway.engine.beans.Client)

Example 18 with Client

use of io.apiman.gateway.engine.beans.Client in project apiman by apiman.

the class InMemoryRegistry method getClient.

/**
 * @see io.apiman.gateway.engine.IRegistry#getClient(java.lang.String, io.apiman.gateway.engine.async.IAsyncResultHandler)
 */
@Override
public void getClient(String apiKey, IAsyncResultHandler<Client> handler) {
    Client client = getClientInternal(apiKey);
    handler.handle(AsyncResultImpl.create(client));
}
Also used : Client(io.apiman.gateway.engine.beans.Client)

Example 19 with Client

use of io.apiman.gateway.engine.beans.Client in project apiman by apiman.

the class StorageImportDispatcher method registerClients.

/**
 * Registers any clients that were imported in the "Registered" state.
 * @throws StorageException
 */
private void registerClients() throws StorageException {
    // $NON-NLS-1$
    logger.info(Messages.i18n.format("StorageExporter.RegisteringClients"));
    for (EntityInfo info : clientsToRegister) {
        // $NON-NLS-1$
        logger.info(Messages.i18n.format("StorageExporter.RegisteringClient", info));
        ClientVersionBean versionBean = storage.getClientVersion(info.organizationId, info.id, info.version);
        Iterator<ContractBean> contractBeans = storage.getAllContracts(info.organizationId, info.id, info.version);
        Client client = new Client();
        client.setOrganizationId(versionBean.getClient().getOrganization().getId());
        client.setClientId(versionBean.getClient().getId());
        client.setVersion(versionBean.getVersion());
        client.setApiKey(versionBean.getApikey());
        Set<Contract> contracts = new HashSet<>();
        while (contractBeans.hasNext()) {
            ContractBean contractBean = contractBeans.next();
            EntityInfo apiInfo = new EntityInfo(contractBean.getApi().getApi().getOrganization().getId(), contractBean.getApi().getApi().getId(), contractBean.getApi().getVersion());
            if (apisToPublish.contains(apiInfo)) {
                Contract contract = new Contract();
                contract.setPlan(contractBean.getPlan().getPlan().getId());
                contract.setApiId(contractBean.getApi().getApi().getId());
                contract.setApiOrgId(contractBean.getApi().getApi().getOrganization().getId());
                contract.setApiVersion(contractBean.getApi().getVersion());
                contract.getPolicies().addAll(aggregateContractPolicies(contractBean, info));
                contracts.add(contract);
            }
        }
        client.setContracts(contracts);
        // Next, register the client with *all* relevant gateways.  This is done by
        // looking up all referenced apis and getting the gateway information for them.
        // Each of those gateways must be told about the client.
        Map<String, IGatewayLink> links = new HashMap<>();
        for (Contract contract : client.getContracts()) {
            ApiVersionBean svb = storage.getApiVersion(contract.getApiOrgId(), contract.getApiId(), contract.getApiVersion());
            Set<ApiGatewayBean> gateways = svb.getGateways();
            if (gateways == null) {
                // $NON-NLS-1$
                throw new PublishingException("No gateways specified for api: " + svb.getApi().getName());
            }
            for (ApiGatewayBean apiGatewayBean : gateways) {
                String gatewayId = apiGatewayBean.getGatewayId();
                if (!links.containsKey(gatewayId)) {
                    IGatewayLink gatewayLink = createGatewayLink(gatewayId);
                    links.put(gatewayId, gatewayLink);
                }
            }
        }
        for (IGatewayLink gatewayLink : links.values()) {
            try {
                gatewayLink.registerClient(client);
            } catch (Exception e) {
                throw new StorageException(e);
            }
        }
    }
}
Also used : ClientVersionBean(io.apiman.manager.api.beans.clients.ClientVersionBean) HashMap(java.util.HashMap) IGatewayLink(io.apiman.manager.api.gateway.IGatewayLink) StorageException(io.apiman.manager.api.core.exceptions.StorageException) ImportNotNeededException(io.apiman.manager.api.exportimport.exceptions.ImportNotNeededException) PublishingException(io.apiman.gateway.engine.beans.exceptions.PublishingException) ContractBean(io.apiman.manager.api.beans.contracts.ContractBean) ApiGatewayBean(io.apiman.manager.api.beans.apis.ApiGatewayBean) PublishingException(io.apiman.gateway.engine.beans.exceptions.PublishingException) Client(io.apiman.gateway.engine.beans.Client) Contract(io.apiman.gateway.engine.beans.Contract) ApiVersionBean(io.apiman.manager.api.beans.apis.ApiVersionBean) StorageException(io.apiman.manager.api.core.exceptions.StorageException) HashSet(java.util.HashSet)

Example 20 with Client

use of io.apiman.gateway.engine.beans.Client in project apiman by apiman.

the class SharedGlobalDataRegistry method registerClient.

// CompositeFuture.all(list) requires raw futures.
@SuppressWarnings("rawtypes")
@Override
public void registerClient(Client client, IAsyncResultHandler<Void> resultHandler) {
    List<Future> futures = new ArrayList<>(client.getContracts().size());
    List<Contract> contracts = new ArrayList<>(client.getContracts());
    String clientIndex = getClientIndex(client);
    // Future for each contract and execute get.
    for (Contract contract : contracts) {
        Future future = Future.future();
        futures.add(future);
        String apiIndex = getApiIndex(contract.getApiOrgId(), contract.getApiId(), contract.getApiVersion());
        objectMap.get(apiIndex, future.completer());
    }
    CompositeFuture.all(futures).setHandler(compositeResult -> {
        if (compositeResult.succeeded()) {
            // If any contract didn't correspond to a stored API.
            Contract failedContract = null;
            for (int i = 0; i < futures.size(); i++) {
                if (futures.get(i).result() == null) {
                    failedContract = contracts.get(0);
                    break;
                }
            }
            // If we found an invalid contract.
            if (failedContract != null) {
                Exception ex = new ApiNotFoundException(Messages.i18n.format("InMemoryRegistry.ApiNotFoundInOrg", failedContract.getApiId(), failedContract.getApiOrgId()));
                resultHandler.handle(AsyncResultImpl.create(ex));
            } else {
                Future<Object> putNewApiKeyFuture = Future.future();
                Future<Object> endFuture = Future.future();
                // Order: Create new API Key reference; Replace old ID -> API mapping; Delete old key reference)
                // This should ensure no breaking/irreconcilable behaviour.
                objectMap.putIfAbsent(client.getApiKey(), client, putNewApiKeyFuture.completer());
                // Replace API Key reference
                putNewApiKeyFuture.compose(clientWithSameApiKey -> {
                    Future<Object> replaceClientFuture = Future.future();
                    // only in hard-coded tests. Generally sameKeyReplace will be null.
                    if (clientWithSameApiKey != null) {
                        // System.err.println("!!!!! Same API Key -- Replacing. Must not delete later. !!!!!!");
                        objectMap.replace(client.getApiKey(), client, replaceClientFuture.completer());
                    } else {
                        objectMap.putIfAbsent(clientIndex, client, replaceClientFuture.completer());
                    }
                    return replaceClientFuture;
                // Remove old API key reference
                }).compose(oldClientRaw -> {
                    Client oldClient = (Client) oldClientRaw;
                    if (oldClientRaw != null && !oldClient.getApiKey().equals(client.getApiKey())) {
                        objectMap.remove(oldClient.getApiKey(), endFuture.completer());
                    } else {
                        endFuture.complete();
                    }
                }, endFuture).setHandler(handleResult(resultHandler));
            }
        } else {
            resultHandler.handle(AsyncResultImpl.create(compositeResult.cause()));
        }
    });
}
Also used : ApiRetiredException(io.apiman.gateway.engine.beans.exceptions.ApiRetiredException) AsyncResultImpl(io.apiman.gateway.engine.async.AsyncResultImpl) LoggerFactory(io.vertx.core.logging.LoggerFactory) ArrayList(java.util.ArrayList) Client(io.apiman.gateway.engine.beans.Client) CompositeFuture(io.vertx.core.CompositeFuture) AsyncMap(io.vertx.core.shareddata.AsyncMap) IAsyncResultHandler(io.apiman.gateway.engine.async.IAsyncResultHandler) Map(java.util.Map) AsyncResult(io.vertx.core.AsyncResult) Logger(io.vertx.core.logging.Logger) Contract(io.apiman.gateway.engine.beans.Contract) ClientNotFoundException(io.apiman.gateway.engine.beans.exceptions.ClientNotFoundException) Vertx(io.vertx.core.Vertx) Future(io.vertx.core.Future) Api(io.apiman.gateway.engine.beans.Api) NoContractFoundException(io.apiman.gateway.engine.beans.exceptions.NoContractFoundException) ApiNotFoundException(io.apiman.gateway.engine.beans.exceptions.ApiNotFoundException) IEngineConfig(io.apiman.gateway.engine.IEngineConfig) List(java.util.List) Messages(io.apiman.gateway.engine.i18n.Messages) IRegistry(io.apiman.gateway.engine.IRegistry) ApiContract(io.apiman.gateway.engine.beans.ApiContract) Optional(java.util.Optional) Handler(io.vertx.core.Handler) ApiNotFoundException(io.apiman.gateway.engine.beans.exceptions.ApiNotFoundException) ArrayList(java.util.ArrayList) ApiRetiredException(io.apiman.gateway.engine.beans.exceptions.ApiRetiredException) ClientNotFoundException(io.apiman.gateway.engine.beans.exceptions.ClientNotFoundException) NoContractFoundException(io.apiman.gateway.engine.beans.exceptions.NoContractFoundException) ApiNotFoundException(io.apiman.gateway.engine.beans.exceptions.ApiNotFoundException) CompositeFuture(io.vertx.core.CompositeFuture) Future(io.vertx.core.Future) Client(io.apiman.gateway.engine.beans.Client) Contract(io.apiman.gateway.engine.beans.Contract) ApiContract(io.apiman.gateway.engine.beans.ApiContract)

Aggregations

Client (io.apiman.gateway.engine.beans.Client)33 Api (io.apiman.gateway.engine.beans.Api)17 Contract (io.apiman.gateway.engine.beans.Contract)14 ApiContract (io.apiman.gateway.engine.beans.ApiContract)10 ClientNotFoundException (io.apiman.gateway.engine.beans.exceptions.ClientNotFoundException)9 PublishingException (io.apiman.gateway.engine.beans.exceptions.PublishingException)9 ApiRetiredException (io.apiman.gateway.engine.beans.exceptions.ApiRetiredException)8 NoContractFoundException (io.apiman.gateway.engine.beans.exceptions.NoContractFoundException)8 ApiNotFoundException (io.apiman.gateway.engine.beans.exceptions.ApiNotFoundException)7 HashMap (java.util.HashMap)7 ApiGatewayBean (io.apiman.manager.api.beans.apis.ApiGatewayBean)6 ApiVersionBean (io.apiman.manager.api.beans.apis.ApiVersionBean)6 ClientVersionBean (io.apiman.manager.api.beans.clients.ClientVersionBean)6 StorageException (io.apiman.manager.api.core.exceptions.StorageException)6 IGatewayLink (io.apiman.manager.api.gateway.IGatewayLink)6 HashSet (java.util.HashSet)6 Policy (io.apiman.gateway.engine.beans.Policy)5 ContractSummaryBean (io.apiman.manager.api.beans.summary.ContractSummaryBean)5 ActionException (io.apiman.manager.api.rest.exceptions.ActionException)5 ApiVersionNotFoundException (io.apiman.manager.api.rest.exceptions.ApiVersionNotFoundException)5