
io.apiman.manager.api.es.EsStorage Maven / Gradle / Ivy
/*
* Copyright 2015 JBoss Inc
*
* Licensed 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 io.apiman.manager.api.es;
import io.apiman.common.util.crypt.DataEncryptionContext;
import io.apiman.common.util.crypt.IDataEncrypter;
import io.apiman.manager.api.beans.apis.ApiBean;
import io.apiman.manager.api.beans.apis.ApiGatewayBean;
import io.apiman.manager.api.beans.apis.ApiPlanBean;
import io.apiman.manager.api.beans.apis.ApiStatus;
import io.apiman.manager.api.beans.apis.ApiVersionBean;
import io.apiman.manager.api.beans.audit.AuditEntityType;
import io.apiman.manager.api.beans.audit.AuditEntryBean;
import io.apiman.manager.api.beans.clients.ClientBean;
import io.apiman.manager.api.beans.clients.ClientStatus;
import io.apiman.manager.api.beans.clients.ClientVersionBean;
import io.apiman.manager.api.beans.contracts.ContractBean;
import io.apiman.manager.api.beans.download.DownloadBean;
import io.apiman.manager.api.beans.gateways.GatewayBean;
import io.apiman.manager.api.beans.idm.PermissionBean;
import io.apiman.manager.api.beans.idm.PermissionType;
import io.apiman.manager.api.beans.idm.RoleBean;
import io.apiman.manager.api.beans.idm.RoleMembershipBean;
import io.apiman.manager.api.beans.idm.UserBean;
import io.apiman.manager.api.beans.orgs.OrganizationBean;
import io.apiman.manager.api.beans.plans.PlanBean;
import io.apiman.manager.api.beans.plans.PlanStatus;
import io.apiman.manager.api.beans.plans.PlanVersionBean;
import io.apiman.manager.api.beans.plugins.PluginBean;
import io.apiman.manager.api.beans.policies.PolicyBean;
import io.apiman.manager.api.beans.policies.PolicyDefinitionBean;
import io.apiman.manager.api.beans.policies.PolicyType;
import io.apiman.manager.api.beans.search.OrderByBean;
import io.apiman.manager.api.beans.search.PagingBean;
import io.apiman.manager.api.beans.search.SearchCriteriaBean;
import io.apiman.manager.api.beans.search.SearchCriteriaFilterBean;
import io.apiman.manager.api.beans.search.SearchCriteriaFilterOperator;
import io.apiman.manager.api.beans.search.SearchResultsBean;
import io.apiman.manager.api.beans.summary.ApiEntryBean;
import io.apiman.manager.api.beans.summary.ApiPlanSummaryBean;
import io.apiman.manager.api.beans.summary.ApiRegistryBean;
import io.apiman.manager.api.beans.summary.ApiSummaryBean;
import io.apiman.manager.api.beans.summary.ApiVersionSummaryBean;
import io.apiman.manager.api.beans.summary.ClientSummaryBean;
import io.apiman.manager.api.beans.summary.ClientVersionSummaryBean;
import io.apiman.manager.api.beans.summary.ContractSummaryBean;
import io.apiman.manager.api.beans.summary.GatewaySummaryBean;
import io.apiman.manager.api.beans.summary.OrganizationSummaryBean;
import io.apiman.manager.api.beans.summary.PlanSummaryBean;
import io.apiman.manager.api.beans.summary.PlanVersionSummaryBean;
import io.apiman.manager.api.beans.summary.PluginSummaryBean;
import io.apiman.manager.api.beans.summary.PolicyDefinitionSummaryBean;
import io.apiman.manager.api.beans.summary.PolicySummaryBean;
import io.apiman.manager.api.core.IStorage;
import io.apiman.manager.api.core.IStorageQuery;
import io.apiman.manager.api.core.exceptions.StorageException;
import io.apiman.manager.api.core.util.PolicyTemplateUtil;
import io.apiman.manager.api.es.beans.ApiDefinitionBean;
import io.apiman.manager.api.es.beans.PoliciesBean;
import io.apiman.manager.api.es.util.AndFilterBuilder;
import io.apiman.manager.api.es.util.FilterBuilders;
import io.apiman.manager.api.es.util.FilteredQueryBuilder;
import io.apiman.manager.api.es.util.QueryBuilder;
import io.apiman.manager.api.es.util.QueryBuilders;
import io.apiman.manager.api.es.util.SearchSourceBuilder;
import io.apiman.manager.api.es.util.SortOrder;
import io.apiman.manager.api.es.util.TermsQueryBuilder;
import io.apiman.manager.api.es.util.XContentBuilder;
import io.searchbox.action.Action;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.cluster.Health;
import io.searchbox.core.Delete;
import io.searchbox.core.DeleteByQuery;
import io.searchbox.core.Get;
import io.searchbox.core.Index;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import io.searchbox.core.SearchResult.Hit;
import io.searchbox.core.SearchScroll;
import io.searchbox.core.SearchScroll.Builder;
import io.searchbox.indices.CreateIndex;
import io.searchbox.indices.IndicesExists;
import io.searchbox.params.Parameters;
import io.searchbox.params.SearchType;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Alternative;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import com.google.gson.Gson;
/**
* An implementation of the API Manager persistence layer that uses git to store
* the entities.
*
* @author [email protected]
*/
@ApplicationScoped @Alternative
public class EsStorage implements IStorage, IStorageQuery {
private static final String DEFAULT_INDEX_NAME = "apiman_manager"; //$NON-NLS-1$
private static int guidCounter = 100;
@Inject @Named("storage")
JestClient esClient;
@Inject IDataEncrypter encrypter;
@PostConstruct
public void postConstruct() {
// Kick the encrypter, causing it to be loaded/resolved in CDI
encrypter.encrypt("", new DataEncryptionContext()); //$NON-NLS-1$
}
private String indexName = DEFAULT_INDEX_NAME;
/**
* Constructor.
*/
public EsStorage() {
}
/**
* Called to initialize the storage.
*/
@Override
public void initialize() {
try {
esClient.execute(new Health.Builder().build());
// TODO Do we need a loop to wait for all nodes to join the cluster?
Action action = new IndicesExists.Builder(getIndexName()).build();
JestResult result = esClient.execute(action);
if (! result.isSucceeded()) {
createIndex(getIndexName());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @param indexName
* @throws Exception
*/
private void createIndex(String indexName) throws Exception {
URL settings = getClass().getResource("index-settings.json"); //$NON-NLS-1$
String source = IOUtils.toString(settings);
JestResult response = esClient.execute(new CreateIndex.Builder(indexName).settings(source).build());
if (!response.isSucceeded()) {
throw new StorageException("Failed to create index " + indexName + ": " + response.getErrorMessage()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* @see io.apiman.manager.api.core.IStorage#beginTx()
*/
@Override
public void beginTx() throws StorageException {
// No Transaction support for ES
}
/**
* @see io.apiman.manager.api.core.IStorage#commitTx()
*/
@Override
public void commitTx() throws StorageException {
// No Transaction support for ES
}
/**
* @see io.apiman.manager.api.core.IStorage#rollbackTx()
*/
@Override
public void rollbackTx() {
// No Transaction support for ES
}
/**
* @see io.apiman.manager.api.core.IStorage#createOrganization(io.apiman.manager.api.beans.orgs.OrganizationBean)
*/
@Override
public void createOrganization(OrganizationBean organization) throws StorageException {
indexEntity("organization", organization.getId(), EsMarshalling.marshall(organization), true); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createClient(io.apiman.manager.api.beans.clients.ClientBean)
*/
@Override
public void createClient(ClientBean client) throws StorageException {
indexEntity("client", id(client.getOrganization().getId(), client.getId()), EsMarshalling.marshall(client)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createClientVersion(io.apiman.manager.api.beans.clients.ClientVersionBean)
*/
@Override
public void createClientVersion(ClientVersionBean version) throws StorageException {
ClientBean client = version.getClient();
String id = id(client.getOrganization().getId(), client.getId(), version.getVersion());
indexEntity("clientVersion", id, EsMarshalling.marshall(version)); //$NON-NLS-1$
PoliciesBean policies = PoliciesBean.from(PolicyType.Client, client.getOrganization().getId(),
client.getId(), version.getVersion());
indexEntity("clientPolicies", id, EsMarshalling.marshall(policies)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createContract(io.apiman.manager.api.beans.contracts.ContractBean)
*/
@Override
public void createContract(ContractBean contract) throws StorageException {
List contracts = getClientContracts(contract.getClient().getClient().getOrganization().getId(),
contract.getClient().getClient().getId(), contract.getClient().getVersion());
for (ContractSummaryBean csb : contracts) {
if (csb.getApiOrganizationId().equals(contract.getApi().getApi().getOrganization().getId()) &&
csb.getApiId().equals(contract.getApi().getApi().getId()) &&
csb.getApiVersion().equals(contract.getApi().getVersion()))
{
throw new StorageException("Error creating contract: duplicate contract detected."); //$NON-NLS-1$
}
}
contract.setId(generateGuid());
indexEntity("contract", String.valueOf(contract.getId()), EsMarshalling.marshall(contract), true); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createApi(io.apiman.manager.api.beans.apis.ApiBean)
*/
@Override
public void createApi(ApiBean api) throws StorageException {
indexEntity("api", id(api.getOrganization().getId(), api.getId()), EsMarshalling.marshall(api)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createApiVersion(io.apiman.manager.api.beans.apis.ApiVersionBean)
*/
@Override
public void createApiVersion(ApiVersionBean version) throws StorageException {
ApiBean api = version.getApi();
String id = id(api.getOrganization().getId(), api.getId(), version.getVersion());
indexEntity("apiVersion", id, EsMarshalling.marshall(version)); //$NON-NLS-1$
PoliciesBean policies = PoliciesBean.from(PolicyType.Api, api.getOrganization().getId(),
api.getId(), version.getVersion());
indexEntity("apiPolicies", id, EsMarshalling.marshall(policies)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createPlan(io.apiman.manager.api.beans.plans.PlanBean)
*/
@Override
public void createPlan(PlanBean plan) throws StorageException {
indexEntity("plan", id(plan.getOrganization().getId(), plan.getId()), EsMarshalling.marshall(plan)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createPlanVersion(io.apiman.manager.api.beans.plans.PlanVersionBean)
*/
@Override
public void createPlanVersion(PlanVersionBean version) throws StorageException {
PlanBean plan = version.getPlan();
String id = id(plan.getOrganization().getId(), plan.getId(), version.getVersion());
indexEntity("planVersion", id, EsMarshalling.marshall(version)); //$NON-NLS-1$
PoliciesBean policies = PoliciesBean.from(PolicyType.Plan, plan.getOrganization().getId(),
plan.getId(), version.getVersion());
indexEntity("planPolicies", id, EsMarshalling.marshall(policies)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createPolicy(io.apiman.manager.api.beans.policies.PolicyBean)
*/
@Override
public void createPolicy(PolicyBean policy) throws StorageException {
String docType = getPoliciesDocType(policy.getType());
String id = id(policy.getOrganizationId(), policy.getEntityId(), policy.getEntityVersion());
Map source = getEntity(docType, id);
if (source == null) {
throw new StorageException("Failed to create policy (missing PoliciesBean)."); //$NON-NLS-1$
}
PoliciesBean policies = EsMarshalling.unmarshallPolicies(source);
policy.setId(generateGuid());
policies.getPolicies().add(policy);
orderPolicies(policies);
updateEntity(docType, id, EsMarshalling.marshall(policies));
}
/**
* @see io.apiman.manager.api.core.IStorage#reorderPolicies(io.apiman.manager.api.beans.policies.PolicyType, java.lang.String, java.lang.String, java.lang.String, java.util.List)
*/
@Override
public void reorderPolicies(PolicyType type, String organizationId, String entityId,
String entityVersion, List newOrder) throws StorageException {
String docType = getPoliciesDocType(type);
String pid = id(organizationId, entityId, entityVersion);
Map source = getEntity(docType, pid);
if (source == null) {
return;
}
PoliciesBean policiesBean = EsMarshalling.unmarshallPolicies(source);
List policies = policiesBean.getPolicies();
List reordered = new ArrayList<>(policies.size());
for (Long policyId : newOrder) {
ListIterator iterator = policies.listIterator();
while (iterator.hasNext()) {
PolicyBean policyBean = iterator.next();
if (policyBean.getId().equals(policyId)) {
iterator.remove();
reordered.add(policyBean);
break;
}
}
}
// Make sure we don't stealth-delete any policies. Put anything
// remaining at the end of the list.
for (PolicyBean policyBean : policies) {
reordered.add(policyBean);
}
policiesBean.setPolicies(reordered);
updateEntity(docType, pid, EsMarshalling.marshall(policiesBean));
}
/**
* Set the order index of all policies.
* @param policies
*/
private void orderPolicies(PoliciesBean policies) {
int idx = 1;
for (PolicyBean policy : policies.getPolicies()) {
policy.setOrderIndex(idx++);
}
}
/**
* @see io.apiman.manager.api.core.IStorage#createGateway(io.apiman.manager.api.beans.gateways.GatewayBean)
*/
@Override
public void createGateway(GatewayBean gateway) throws StorageException {
indexEntity("gateway", gateway.getId(), EsMarshalling.marshall(gateway)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createPlugin(io.apiman.manager.api.beans.plugins.PluginBean)
*/
@Override
public void createPlugin(PluginBean plugin) throws StorageException {
plugin.setId(generateGuid());
indexEntity("plugin", String.valueOf(plugin.getId()), EsMarshalling.marshall(plugin), true); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createDownload(io.apiman.manager.api.beans.download.DownloadBean)
*/
@Override
public void createDownload(DownloadBean download) throws StorageException {
indexEntity("download", download.getId(), EsMarshalling.marshall(download)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createPolicyDefinition(io.apiman.manager.api.beans.policies.PolicyDefinitionBean)
*/
@Override
public void createPolicyDefinition(PolicyDefinitionBean policyDef) throws StorageException {
indexEntity("policyDef", policyDef.getId(), EsMarshalling.marshall(policyDef)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createRole(io.apiman.manager.api.beans.idm.RoleBean)
*/
@Override
public void createRole(RoleBean role) throws StorageException {
indexEntity("role", role.getId(), EsMarshalling.marshall(role)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#createAuditEntry(io.apiman.manager.api.beans.audit.AuditEntryBean)
*/
@Override
public void createAuditEntry(AuditEntryBean entry) throws StorageException {
if (entry == null) {
return;
}
entry.setId(generateGuid());
indexEntity("auditEntry", String.valueOf(entry.getId()), EsMarshalling.marshall(entry)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updateOrganization(io.apiman.manager.api.beans.orgs.OrganizationBean)
*/
@Override
public void updateOrganization(OrganizationBean organization) throws StorageException {
updateEntity("organization", organization.getId(), EsMarshalling.marshall(organization)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updateClient(io.apiman.manager.api.beans.clients.ClientBean)
*/
@Override
public void updateClient(ClientBean client) throws StorageException {
updateEntity("client", id(client.getOrganization().getId(), client.getId()), EsMarshalling.marshall(client)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updateClientVersion(io.apiman.manager.api.beans.clients.ClientVersionBean)
*/
@Override
public void updateClientVersion(ClientVersionBean version) throws StorageException {
ClientBean client = version.getClient();
updateEntity("clientVersion", id(client.getOrganization().getId(), client.getId(), version.getVersion()), //$NON-NLS-1$
EsMarshalling.marshall(version));
}
/**
* @see io.apiman.manager.api.core.IStorage#updateApi(io.apiman.manager.api.beans.apis.ApiBean)
*/
@Override
public void updateApi(ApiBean api) throws StorageException {
updateEntity("api", id(api.getOrganization().getId(), api.getId()), EsMarshalling.marshall(api)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updateApiVersion(io.apiman.manager.api.beans.apis.ApiVersionBean)
*/
@Override
public void updateApiVersion(ApiVersionBean version) throws StorageException {
ApiBean api = version.getApi();
updateEntity("apiVersion", id(api.getOrganization().getId(), api.getId(), version.getVersion()), //$NON-NLS-1$
EsMarshalling.marshall(version));
}
/**
* @see io.apiman.manager.api.core.IStorage#updateApiDefinition(io.apiman.manager.api.beans.apis.ApiVersionBean, java.io.InputStream)
*/
@Override
public void updateApiDefinition(ApiVersionBean version, InputStream definitionStream)
throws StorageException {
InputStream apiDefinition = null;
try {
String id = id(version.getApi().getOrganization().getId(), version.getApi().getId(), version.getVersion()) + ":def"; //$NON-NLS-1$
apiDefinition = getApiDefinition(version);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(definitionStream, baos);
String data = Base64.encodeBase64String(baos.toByteArray());
ApiDefinitionBean definition = new ApiDefinitionBean();
definition.setData(data);
if (apiDefinition == null) {
indexEntity("apiDefinition", id, EsMarshalling.marshall(definition)); //$NON-NLS-1$
} else {
updateEntity("apiDefinition", id, EsMarshalling.marshall(definition)); //$NON-NLS-1$
}
} catch (IOException e) {
throw new StorageException(e);
} finally {
IOUtils.closeQuietly(apiDefinition);
}
}
/**
* @see io.apiman.manager.api.core.IStorage#updatePlan(io.apiman.manager.api.beans.plans.PlanBean)
*/
@Override
public void updatePlan(PlanBean plan) throws StorageException {
updateEntity("plan", id(plan.getOrganization().getId(), plan.getId()), EsMarshalling.marshall(plan)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updatePlanVersion(io.apiman.manager.api.beans.plans.PlanVersionBean)
*/
@Override
public void updatePlanVersion(PlanVersionBean version) throws StorageException {
PlanBean plan = version.getPlan();
updateEntity("planVersion", id(plan.getOrganization().getId(), plan.getId(), version.getVersion()), //$NON-NLS-1$
EsMarshalling.marshall(version));
}
/**
* @see io.apiman.manager.api.core.IStorage#updatePolicy(io.apiman.manager.api.beans.policies.PolicyBean)
*/
@Override
public void updatePolicy(PolicyBean policy) throws StorageException {
String docType = getPoliciesDocType(policy.getType());
String pid = id(policy.getOrganizationId(), policy.getEntityId(), policy.getEntityVersion());
Map source = getEntity(docType, pid);
if (source == null) {
throw new StorageException("Policy not found."); //$NON-NLS-1$
}
PoliciesBean policies = EsMarshalling.unmarshallPolicies(source);
List policyBeans = policies.getPolicies();
boolean found = false;
if (policyBeans != null) {
for (PolicyBean policyBean : policyBeans) {
if (policyBean.getId().equals(policy.getId())) {
policyBean.setConfiguration(policy.getConfiguration());
policyBean.setModifiedBy(policy.getModifiedBy());
policyBean.setModifiedOn(policy.getModifiedOn());
found = true;
break;
}
}
}
if (found) {
updateEntity(docType, pid, EsMarshalling.marshall(policies));
} else {
throw new StorageException("Policy not found."); //$NON-NLS-1$
}
}
/**
* @see io.apiman.manager.api.core.IStorage#updateGateway(io.apiman.manager.api.beans.gateways.GatewayBean)
*/
@Override
public void updateGateway(GatewayBean gateway) throws StorageException {
updateEntity("gateway", gateway.getId(), EsMarshalling.marshall(gateway)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updatePolicyDefinition(io.apiman.manager.api.beans.policies.PolicyDefinitionBean)
*/
@Override
public void updatePolicyDefinition(PolicyDefinitionBean policyDef) throws StorageException {
updateEntity("policyDef", policyDef.getId(), EsMarshalling.marshall(policyDef)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updatePlugin(io.apiman.manager.api.beans.plugins.PluginBean)
*/
@Override
public void updatePlugin(PluginBean pluginBean) throws StorageException {
updateEntity("plugin", String.valueOf(pluginBean.getId()), EsMarshalling.marshall(pluginBean)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#updateRole(io.apiman.manager.api.beans.idm.RoleBean)
*/
@Override
public void updateRole(RoleBean role) throws StorageException {
updateEntity("role", role.getId(), EsMarshalling.marshall(role)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteOrganization(io.apiman.manager.api.beans.orgs.OrganizationBean)
*/
@Override
@SuppressWarnings("nls")
public void deleteOrganization(OrganizationBean organization) throws StorageException {
String orgId = organization.getId().replace('"', '_');
String query = "{\n" +
" \"query\": {\n" +
" \"filtered\": {\n" +
" \"query\": {\n" +
" \"match_all\": {}\n" +
" },\n" +
" \"filter\": {\n" +
" \"or\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"organizationId\": \"" + orgId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"clientOrganizationId\": \"" + orgId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"apiOrganizationId\": \"" + orgId + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
DeleteByQuery deleteByQuery = new DeleteByQuery.Builder(query).addIndex(getIndexName())
.addType("api")
.addType("apiPolicies")
.addType("apiVersion")
.addType("auditEntry")
.addType("client")
.addType("clientPolicies")
.addType("clientVersion")
.addType("contract")
.addType("plan")
.addType("planPolicies")
.addType("planVersion")
.addType("roleMembership")
.build();
try {
JestResult response = esClient.execute(deleteByQuery);
if (!response.isSucceeded()) {
throw new StorageException(response.getErrorMessage());
}
} catch (Exception e) {
throw new StorageException(e);
}
deleteEntity("organization", orgId); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteClient(io.apiman.manager.api.beans.clients.ClientBean)
*/
@Override
@SuppressWarnings("nls")
public void deleteClient(ClientBean client) throws StorageException {
String clientId = client.getId().replace('"', '_');
String orgId = client.getOrganization().getId().replace('"', '_');
String query = "{\n" +
" \"query\": {\n" +
" \"filtered\": {\n" +
" \"query\": {\n" +
" \"match_all\": {}\n" +
" },\n" +
" \"filter\": {\n" +
" \"bool\": {\n" +
" \"must\": [\n" +
" {\n" +
" \"bool\": {\n" +
" \"should\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"clientOrganizationId\": \"" + orgId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"organizationId\": \"" + orgId + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" },\n" +
" {\n" +
" \"bool\": {\n" +
" \"should\": [\n" +
" {\n" +
" \"bool\": {\n" +
" \"must\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"entityId\": \"" + clientId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"entityType\": \"" + AuditEntityType.Client.name() + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" },\n" +
" {\n" +
" \"bool\": {\n" +
" \"must\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"entityId\": \"" + clientId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"type\": \"" + AuditEntityType.Client.name() + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"clientId\": \"" + clientId + "\"\n" +
" }\n" +
" }" +
" ]\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
DeleteByQuery deleteByQuery = new DeleteByQuery.Builder(query).addIndex(getIndexName())
.addType("auditEntry")
.addType("client")
.addType("clientVersion")
.addType("clientPolicies")
.addType("contract")
.build();
try {
JestResult response = esClient.execute(deleteByQuery);
if (!response.isSucceeded()) {
throw new StorageException(response.getErrorMessage());
}
} catch (Exception e) {
throw new StorageException(e);
}
deleteEntity("client", id(orgId, clientId)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteClientVersion(io.apiman.manager.api.beans.clients.ClientVersionBean)
*/
@Override
public void deleteClientVersion(ClientVersionBean version) throws StorageException {
ClientBean client = version.getClient();
deleteEntity("clientVersion", id(client.getOrganization().getId(), client.getId(), version.getVersion())); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteContract(io.apiman.manager.api.beans.contracts.ContractBean)
*/
@Override
public void deleteContract(ContractBean contract) throws StorageException {
deleteEntity("contract", String.valueOf(contract.getId())); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteApi(io.apiman.manager.api.beans.apis.ApiBean)
*/
@Override
@SuppressWarnings("nls")
public void deleteApi(ApiBean api) throws StorageException {
String apiId = api.getId().replace('"', '_');
String orgId = api.getOrganization().getId().replace('"', '_');
String query = "{\n" +
" \"query\": {\n" +
" \"filtered\": {\n" +
" \"query\": {\n" +
" \"match_all\": {}\n" +
" },\n" +
" \"filter\": {\n" +
" \"bool\": {\n" +
" \"must\": [\n" +
" {\n" +
" \"bool\": {\n" +
" \"should\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"apiOrganizationId\": \"" + orgId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"organizationId\": \"" + orgId + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" },\n" +
" {\n" +
" \"bool\": {\n" +
" \"should\": [\n" +
" {\n" +
" \"bool\": {\n" +
" \"must\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"entityId\": \"" + apiId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"entityType\": \"" + AuditEntityType.Api.name() + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" },\n" +
" {\n" +
" \"bool\": {\n" +
" \"must\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"entityId\": \"" + apiId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"type\": \"" + AuditEntityType.Api.name() + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"apiId\": \"" + apiId + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
DeleteByQuery deleteByQuery = new DeleteByQuery.Builder(query).addIndex(getIndexName())
.addType("auditEntry")
.addType("api")
.addType("apiVersion")
.addType("apiPolicies")
.addType("contract")
.build();
try {
JestResult response = esClient.execute(deleteByQuery);
if (!response.isSucceeded()) {
throw new StorageException(response.getErrorMessage());
}
} catch (Exception e) {
throw new StorageException(e);
}
deleteEntity("api", id(orgId, apiId)); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteApiVersion(io.apiman.manager.api.beans.apis.ApiVersionBean)
*/
@Override
public void deleteApiVersion(ApiVersionBean version) throws StorageException {
deleteApiDefinition(version);
ApiBean api = version.getApi();
String id = id(api.getOrganization().getId(), api.getId(), version.getVersion());
deleteEntity("apiVersion", id); //$NON-NLS-1$
deleteEntity("apiPolicies", id); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteApiDefinition(io.apiman.manager.api.beans.apis.ApiVersionBean)
*/
@Override
public void deleteApiDefinition(ApiVersionBean version) throws StorageException {
String id = id(version.getApi().getOrganization().getId(), version.getApi().getId(), version.getVersion()) + ":def"; //$NON-NLS-1$
deleteEntity("apiDefinition", id); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deletePlan(io.apiman.manager.api.beans.plans.PlanBean)
*/
@Override
@SuppressWarnings("nls")
public void deletePlan(PlanBean plan) throws StorageException {
String planId = plan.getId().replace('"', '_');
String orgId = plan.getOrganization().getId().replace('"', '_');
String query = "{\n" +
" \"query\": {\n" +
" \"filtered\": {\n" +
" \"query\": {\n" +
" \"match_all\": {}\n" +
" },\n" +
" \"filter\": {\n" +
" \"or\": [\n" +
" {\n" +
" \"and\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"entityId\": \"" + planId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"entityType\": \"" + AuditEntityType.Plan.name() + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"organizationId\": \"" + orgId + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"and\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"planId\": \"" + planId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"organizationId\": \"" + orgId + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"and\": [\n" +
" {\n" +
" \"term\": {\n" +
" \"entityId\": \"" + planId + "\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"term\": {\n" +
" \"type\": \"" + AuditEntityType.Plan.name() + "\"\n" +
" }\n" +
" }\n" +
" ]\n" +
" }\n" +
" ]\n" +
" }\n" +
" }\n" +
" }\n" +
"}";
DeleteByQuery deleteByQuery = new DeleteByQuery.Builder(query).addIndex(getIndexName())
.addType("auditEntry")
.addType("planVersion")
.build();
try {
JestResult response = esClient.execute(deleteByQuery);
if (!response.isSucceeded()) {
throw new StorageException(response.getErrorMessage());
}
} catch (Exception e) {
throw new StorageException(e);
}
deleteEntity("plan", id(plan.getOrganization().getId(), plan.getId())); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deletePlanVersion(io.apiman.manager.api.beans.plans.PlanVersionBean)
*/
@Override
public void deletePlanVersion(PlanVersionBean version) throws StorageException {
PlanBean plan = version.getPlan();
deleteEntity("planVersion", id(plan.getOrganization().getId(), plan.getId(), version.getVersion())); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deletePolicy(io.apiman.manager.api.beans.policies.PolicyBean)
*/
@Override
public void deletePolicy(PolicyBean policy) throws StorageException {
String docType = getPoliciesDocType(policy.getType());
String pid = id(policy.getOrganizationId(), policy.getEntityId(), policy.getEntityVersion());
Map source = getEntity(docType, pid);
if (source == null) {
throw new StorageException("Policy not found."); //$NON-NLS-1$
}
PoliciesBean policies = EsMarshalling.unmarshallPolicies(source);
if (policies == null) throw new StorageException("Policy not found."); //$NON-NLS-1$
List policyBeans = policies.getPolicies();
boolean found = false;
if (policyBeans != null) {
for (PolicyBean policyBean : policyBeans) {
if (policyBean.getId().equals(policy.getId())) {
policies.getPolicies().remove(policyBean);
found = true;
break;
}
}
}
if (found) {
updateEntity(docType, pid, EsMarshalling.marshall(policies));
} else {
throw new StorageException("Policy not found."); //$NON-NLS-1$
}
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteGateway(io.apiman.manager.api.beans.gateways.GatewayBean)
*/
@Override
public void deleteGateway(GatewayBean gateway) throws StorageException {
deleteEntity("gateway", gateway.getId()); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deletePlugin(io.apiman.manager.api.beans.plugins.PluginBean)
*/
@Override
public void deletePlugin(PluginBean plugin) throws StorageException {
deleteEntity("plugin", String.valueOf(plugin.getId())); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deleteDownload(io.apiman.manager.api.beans.download.DownloadBean)
*/
@Override
public void deleteDownload(DownloadBean download) throws StorageException {
deleteEntity("download", download.getId()); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#deletePolicyDefinition(io.apiman.manager.api.beans.policies.PolicyDefinitionBean)
*/
@Override
public void deletePolicyDefinition(PolicyDefinitionBean policyDef) throws StorageException {
deleteEntity("policyDef", policyDef.getId()); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see io.apiman.manager.api.core.IStorage#deleteRole(io.apiman.manager.api.beans.idm.RoleBean)
*/
@Override
public void deleteRole(RoleBean role) throws StorageException {
deleteEntity("role", role.getId()); //$NON-NLS-1$
}
/**
* @see io.apiman.manager.api.core.IStorage#getOrganization(java.lang.String)
*/
@Override
public OrganizationBean getOrganization(String id) throws StorageException {
Map source = getEntity("organization", id); //$NON-NLS-1$
return EsMarshalling.unmarshallOrganization(source);
}
/**
* @see io.apiman.manager.api.core.IStorage#getClient(java.lang.String, java.lang.String)
*/
@Override
public ClientBean getClient(String organizationId, String id) throws StorageException {
Map source = getEntity("client", id(organizationId, id)); //$NON-NLS-1$
if (source == null) {
return null;
}
ClientBean bean = EsMarshalling.unmarshallClient(source);
bean.setOrganization(getOrganization(organizationId));
return bean;
}
/**
* @see io.apiman.manager.api.core.IStorage#getClientVersion(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public ClientVersionBean getClientVersion(String organizationId, String clientId,
String version) throws StorageException {
Map source = getEntity("clientVersion", id(organizationId, clientId, version)); //$NON-NLS-1$
if (source == null) {
return null;
}
ClientVersionBean bean = EsMarshalling.unmarshallClientVersion(source);
bean.setClient(getClient(organizationId, clientId));
return bean;
}
/**
* @see io.apiman.manager.api.core.IStorage#getContract(java.lang.Long)
*/
@SuppressWarnings("nls")
@Override
public ContractBean getContract(Long id) throws StorageException {
Map source = getEntity("contract", String.valueOf(id)); //$NON-NLS-1$
ContractBean contract = EsMarshalling.unmarshallContract(source);
if (contract == null) {
return null;
}
String clientOrgId = (String) source.get("clientOrganizationId");
String clientId = (String) source.get("clientId");
String clientVersion = (String) source.get("clientVersion");
String apiOrgId = (String) source.get("apiOrganizationId");
String apiId = (String) source.get("apiId");
String apiVersion = (String) source.get("apiVersion");
String planId = (String) source.get("planId");
String planVersion = (String) source.get("planVersion");
ClientVersionBean avb = getClientVersion(clientOrgId, clientId, clientVersion);
ApiVersionBean svb = getApiVersion(apiOrgId, apiId, apiVersion);
PlanVersionBean pvb = getPlanVersion(apiOrgId, planId, planVersion);
contract.setClient(avb);
contract.setPlan(pvb);
contract.setApi(svb);
return contract;
}
/**
* @see io.apiman.manager.api.core.IStorage#getApi(java.lang.String, java.lang.String)
*/
@Override
public ApiBean getApi(String organizationId, String id) throws StorageException {
Map source = getEntity("api", id(organizationId, id)); //$NON-NLS-1$
if (source == null) {
return null;
}
ApiBean bean = EsMarshalling.unmarshallApi(source);
bean.setOrganization(getOrganization(organizationId));
return bean;
}
/**
* @see io.apiman.manager.api.core.IStorage#getApiVersion(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public ApiVersionBean getApiVersion(String organizationId, String apiId, String version)
throws StorageException {
Map source = getEntity("apiVersion", id(organizationId, apiId, version)); //$NON-NLS-1$
if (source == null) {
return null;
}
ApiVersionBean bean = EsMarshalling.unmarshallApiVersion(source);
bean.setApi(getApi(organizationId, apiId));
return bean;
}
/**
* @see io.apiman.manager.api.core.IStorage#getApiDefinition(io.apiman.manager.api.beans.apis.ApiVersionBean)
*/
@Override
public InputStream getApiDefinition(ApiVersionBean version) throws StorageException {
String id = id(version.getApi().getOrganization().getId(), version.getApi().getId(), version.getVersion()) + ":def"; //$NON-NLS-1$
Map source = getEntity("apiDefinition", id); //$NON-NLS-1$
if (source == null) {
return null;
}
ApiDefinitionBean def = EsMarshalling.unmarshallApiDefinition(source);
if (def == null) return null;
String data = def.getData();
return new ByteArrayInputStream(Base64.decodeBase64(data));
}
/**
* @see io.apiman.manager.api.core.IStorage#getPlan(java.lang.String, java.lang.String)
*/
@Override
public PlanBean getPlan(String organizationId, String id) throws StorageException {
Map source = getEntity("plan", id(organizationId, id)); //$NON-NLS-1$
if (source == null) {
return null;
}
PlanBean bean = EsMarshalling.unmarshallPlan(source);
bean.setOrganization(getOrganization(organizationId));
return bean;
}
/**
* @see io.apiman.manager.api.core.IStorage#getPlanVersion(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public PlanVersionBean getPlanVersion(String organizationId, String planId, String version)
throws StorageException {
Map source = getEntity("planVersion", id(organizationId, planId, version)); //$NON-NLS-1$
if (source == null) {
return null;
}
PlanVersionBean bean = EsMarshalling.unmarshallPlanVersion(source);
bean.setPlan(getPlan(organizationId, planId));
return bean;
}
/**
* @see io.apiman.manager.api.core.IStorage#getPolicy(io.apiman.manager.api.beans.policies.PolicyType, java.lang.String, java.lang.String, java.lang.String, java.lang.Long)
*/
@Override
public PolicyBean getPolicy(PolicyType type, String organizationId, String entityId, String version,
Long id) throws StorageException {
String docType = getPoliciesDocType(type);
String pid = id(organizationId, entityId, version);
Map source = getEntity(docType, pid);
if (source == null) {
return null;
}
PoliciesBean policies = EsMarshalling.unmarshallPolicies(source);
if (policies == null) return null;
List policyBeans = policies.getPolicies();
if (policyBeans != null) {
for (PolicyBean policyBean : policyBeans) {
if (policyBean.getId().equals(id)) {
PolicyDefinitionBean def = getPolicyDefinition(policyBean.getDefinition().getId());
policyBean.setDefinition(def);
return policyBean;
}
}
}
return null;
}
/**
* @see io.apiman.manager.api.core.IStorage#getGateway(java.lang.String)
*/
@Override
public GatewayBean getGateway(String id) throws StorageException {
Map source = getEntity("gateway", id); //$NON-NLS-1$
return EsMarshalling.unmarshallGateway(source);
}
/**
* @see io.apiman.manager.api.core.IStorage#getDownload(java.lang.String)
*/
@Override
public DownloadBean getDownload(String id) throws StorageException {
Map source = getEntity("download", id); //$NON-NLS-1$
return EsMarshalling.unmarshallDownload(source);
}
/**
* @see io.apiman.manager.api.core.IStorage#getPlugin(long)
*/
@Override
public PluginBean getPlugin(long id) throws StorageException {
Map source = getEntity("plugin", String.valueOf(id)); //$NON-NLS-1$
return EsMarshalling.unmarshallPlugin(source);
}
/**
* @see io.apiman.manager.api.core.IStorage#getPlugin(java.lang.String, java.lang.String)
*/
@Override
public PluginBean getPlugin(String groupId, String artifactId) throws StorageException {
try {
@SuppressWarnings("nls")
QueryBuilder qb = QueryBuilders.filteredQuery(
QueryBuilders.matchAllQuery(),
FilterBuilders.andFilter(
FilterBuilders.termFilter("groupId", groupId),
FilterBuilders.termFilter("artifactId", artifactId)
)
);
SearchSourceBuilder builder = new SearchSourceBuilder().query(qb).size(2);
List,Void>> hits = listEntities("plugin", builder); //$NON-NLS-1$
if (hits.size() == 1) {
Hit
© 2015 - 2025 Weber Informatics LLC | Privacy Policy