/* * Copyright 2016 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.manager.api.beans.apis.ApiBean; import io.apiman.manager.api.beans.apis.ApiVersionBean; import io.apiman.manager.api.beans.audit.AuditEntryBean; import io.apiman.manager.api.beans.clients.ClientBean; 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.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.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.PolicyDefinitionTemplateBean; import io.apiman.manager.api.beans.policies.PolicyType; import io.apiman.manager.api.beans.summary.PolicyFormType; import io.apiman.manager.api.es.beans.ApiDefinitionBean; import io.apiman.manager.api.es.beans.PoliciesBean; import io.apiman.manager.api.es.util.XContentBuilder; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Type; import java.util.Date; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.BeanUtilsBean; import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; /** * @author eric.wittmann@gmail.com */ @SuppressWarnings("nls") public class EsMarshallingTest { /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.es.beans.PoliciesBean)}. */ @Test public void testMarshallPoliciesBean() throws Exception { PoliciesBean bean = new PoliciesBean(); bean.setEntityId("ENTITY_ID"); bean.setOrganizationId("ORG_ID"); bean.setEntityVersion("VERSION"); bean.setType(PolicyType.Api); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ORG_ID\",\"entityId\":\"ENTITY_ID\",\"entityVersion\":\"VERSION\",\"type\":\"Api\"}", builder.string()); PolicyBean policy = new PolicyBean(); policy.setCreatedBy("CREATED_BY"); policy.setCreatedOn(new Date(1)); policy.setConfiguration("CONFIGURATION"); policy.setDescription("DESCRIPTION HERE."); policy.setEntityId("ENTITY_ID"); policy.setEntityVersion("ENTITY_VERSION"); policy.setId(17L); policy.setModifiedBy("MODIFIED_BY"); policy.setModifiedOn(new Date(2)); policy.setName("NAME"); policy.setOrderIndex(9); policy.setOrganizationId("ORG_ID"); policy.setType(PolicyType.Api); policy.setDefinition(new PolicyDefinitionBean()); policy.getDefinition().setDeleted(false); policy.getDefinition().setDescription("POLICY_DEF_DESCRIPTION"); policy.getDefinition().setForm("FORM"); policy.getDefinition().setFormType(PolicyFormType.JsonSchema); policy.getDefinition().setIcon("ICON"); policy.getDefinition().setId("POLICY_DEF_ID"); policy.getDefinition().setName("POLICY DEF NAME"); policy.getDefinition().setPluginId(27L); policy.getDefinition().setPolicyImpl("POLICY_IMPL"); PolicyDefinitionTemplateBean template = new PolicyDefinitionTemplateBean(); template.setTemplate("TEMPLATE"); template.setLanguage("EN_US"); policy.getDefinition().getTemplates().add(template ); bean.getPolicies().add(policy); builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ORG_ID\",\"entityId\":\"ENTITY_ID\",\"entityVersion\":\"VERSION\",\"type\":\"Api\",\"policies\":[" + "{\"id\":17,\"name\":\"NAME\",\"configuration\":\"CONFIGURATION\",\"createdBy\":\"CREATED_BY\",\"createdOn\":1,\"modifiedBy\":\"MODIFIED_BY\",\"modifiedOn\":2,\"definitionId\":\"POLICY_DEF_ID\",\"orderIndex\":9}]}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.gateways.GatewayBean)}. */ @Test public void testMarshallGatewayBean() throws Exception { GatewayBean bean = createBean(GatewayBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":\"ID\",\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"type\":\"REST\",\"configuration\":\"CONFIGURATION\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"modifiedBy\":\"MODIFIEDBY\",\"modifiedOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.es.beans.ApiDefinitionBean)}. */ @Test public void testMarshallApiDefinitionBean() throws Exception { ApiDefinitionBean bean = new ApiDefinitionBean(); bean.setData("DATA"); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"data\":\"DATA\"}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.contracts.ContractBean)}. */ @Test public void testMarshallContractBean() throws Exception { ContractBean bean = createBean(ContractBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":17,\"clientOrganizationId\":\"ID\",\"clientOrganizationName\":\"NAME\",\"clientId\":\"ID\",\"clientName\":\"NAME\",\"clientVersion\":\"VERSION\",\"apiOrganizationId\":\"ID\",\"apiOrganizationName\":\"NAME\",\"apiId\":\"ID\",\"apiName\":\"NAME\",\"apiVersion\":\"VERSION\",\"apiDescription\":\"DESCRIPTION\",\"planName\":\"NAME\",\"planId\":\"ID\",\"planVersion\":\"VERSION\",\"createdOn\":1,\"createdBy\":\"CREATEDBY\"}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.plans.PlanBean)}. */ @Test public void testMarshallPlanBean() throws Exception { PlanBean bean = createBean(PlanBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ID\",\"organizationName\":\"NAME\",\"id\":\"ID\",\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.plans.PlanVersionBean)}. */ @Test public void testMarshallPlanVersionBean() throws Exception { PlanVersionBean bean = createBean(PlanVersionBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ID\",\"organizationName\":\"NAME\",\"planId\":\"ID\",\"planName\":\"NAME\",\"planDescription\":\"DESCRIPTION\",\"version\":\"VERSION\",\"status\":\"Created\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"modifiedBy\":\"MODIFIEDBY\",\"modifiedOn\":1,\"lockedOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.apis.ApiBean)}. */ @Test public void testMarshallApiBean() throws Exception { ApiBean bean = createBean(ApiBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ID\",\"organizationName\":\"NAME\",\"id\":\"ID\",\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"numPublished\":11}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.apis.ApiVersionBean)}. */ @Test public void testMarshallApiVersionBean() throws Exception { ApiVersionBean bean = createBean(ApiVersionBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ID\",\"organizationName\":\"NAME\",\"apiId\":\"ID\",\"apiName\":\"NAME\",\"apiDescription\":\"DESCRIPTION\",\"version\":\"VERSION\",\"status\":\"Created\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"modifiedBy\":\"MODIFIEDBY\",\"modifiedOn\":1,\"publishedOn\":1,\"retiredOn\":1,\"publicAPI\":true,\"endpoint\":\"ENDPOINT\",\"endpointType\":\"rest\",\"endpointContentType\":\"json\",\"parsePayload\":true,\"definitionType\":\"None\",\"gateways\":[{\"gatewayId\":\"GATEWAYID\"}],\"plans\":[{\"planId\":\"PLANID\",\"version\":\"VERSION\"}],\"endpointProperties\":{\"KEY-1\":\"VALUE-1\",\"KEY-2\":\"VALUE-2\"}}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.clients.ClientBean)}. */ @Test public void testMarshallClientBean() throws Exception { ClientBean bean = createBean(ClientBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ID\",\"organizationName\":\"NAME\",\"id\":\"ID\",\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.clients.ClientVersionBean)}. */ @Test public void testMarshallClientVersionBean() throws Exception { ClientVersionBean bean = createBean(ClientVersionBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"organizationId\":\"ID\",\"organizationName\":\"NAME\",\"clientId\":\"ID\",\"clientName\":\"NAME\",\"clientDescription\":\"DESCRIPTION\",\"version\":\"VERSION\",\"apikey\":\"APIKEY\",\"status\":\"Created\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"modifiedBy\":\"MODIFIEDBY\",\"modifiedOn\":1,\"publishedOn\":1,\"retiredOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.audit.AuditEntryBean)}. */ @Test public void testMarshallAuditEntryBean() throws Exception { AuditEntryBean bean = createBean(AuditEntryBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":17,\"organizationId\":\"ORGANIZATIONID\",\"entityId\":\"ENTITYID\",\"entityType\":\"Organization\",\"entityVersion\":\"ENTITYVERSION\",\"data\":\"DATA\",\"who\":\"WHO\",\"what\":\"Create\",\"createdOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.orgs.OrganizationBean)}. */ @Test public void testMarshallOrganizationBean() throws Exception { OrganizationBean bean = createBean(OrganizationBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":\"ID\",\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"modifiedBy\":\"MODIFIEDBY\",\"modifiedOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.idm.RoleMembershipBean)}. */ @Test public void testMarshallRoleMembershipBean() throws Exception { RoleMembershipBean bean = createBean(RoleMembershipBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":17,\"organizationId\":\"ORGANIZATIONID\",\"roleId\":\"ROLEID\",\"userId\":\"USERID\",\"createdOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.idm.UserBean)}. */ @Test public void testMarshallUserBean() throws Exception { UserBean bean = createBean(UserBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"username\":\"USERNAME\",\"email\":\"EMAIL\",\"fullName\":\"FULLNAME\",\"joinedOn\":1}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.idm.RoleBean)}. */ @Test public void testMarshallRoleBean() throws Exception { RoleBean bean = createBean(RoleBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":\"ID\",\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"autoGrant\":true,\"permissions\":[\"orgView\",\"orgEdit\"]}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.policies.PolicyDefinitionBean)}. */ @Test public void testMarshallPolicyDefinitionBean() throws Exception { PolicyDefinitionBean bean = createBean(PolicyDefinitionBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":\"ID\",\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"form\":\"FORM\",\"formType\":\"Default\",\"icon\":\"ICON\",\"pluginId\":17,\"policyImpl\":\"POLICYIMPL\",\"deleted\":false,\"templates\":[{\"language\":\"LANGUAGE\",\"template\":\"TEMPLATE\"},{\"language\":\"LANGUAGE\",\"template\":\"TEMPLATE\"}]}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.plugins.PluginBean)}. */ @Test public void testMarshallPluginBean() throws Exception { PluginBean bean = createBean(PluginBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":17,\"name\":\"NAME\",\"description\":\"DESCRIPTION\",\"createdBy\":\"CREATEDBY\",\"createdOn\":1,\"groupId\":\"GROUPID\",\"artifactId\":\"ARTIFACTID\",\"version\":\"VERSION\",\"classifier\":\"CLASSIFIER\",\"type\":\"TYPE\",\"deleted\":false}", builder.string()); } /** * Test method for {@link io.apiman.manager.api.es.EsMarshalling#marshall(io.apiman.manager.api.beans.download.DownloadBean)}. */ @Test public void testMarshallDownloadBean() throws Exception { DownloadBean bean = createBean(DownloadBean.class); XContentBuilder builder = EsMarshalling.marshall(bean); Assert.assertEquals("{\"id\":\"ID\",\"type\":\"exportJson\",\"path\":\"PATH\",\"expires\":1}", builder.string()); } /** * Fabricates a new instance of the given bean type. Uses reflection to figure * out all the fields and assign generated values for each. */ private static <T> T createBean(Class<T> beanClass) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException { T bean = beanClass.newInstance(); Map<String, String> beanProps = BeanUtils.describe(bean); for (String key : beanProps.keySet()) { try { Field declaredField = beanClass.getDeclaredField(key); Class<?> fieldType = declaredField.getType(); if (fieldType == String.class ) { BeanUtils.setProperty(bean, key, StringUtils.upperCase(key)); } else if (fieldType == Boolean.class || fieldType == boolean.class) { BeanUtils.setProperty(bean, key, Boolean.TRUE); } else if (fieldType == Date.class) { BeanUtils.setProperty(bean, key, new Date(1)); } else if (fieldType == Long.class || fieldType == long.class) { BeanUtils.setProperty(bean, key, 17L); } else if (fieldType == Integer.class || fieldType == long.class) { BeanUtils.setProperty(bean, key, 11); } else if (fieldType == Set.class ) { // Initialize to a linked hash set so that order is maintained. BeanUtils.setProperty(bean, key, new LinkedHashSet()); Type genericType = declaredField.getGenericType(); String typeName = genericType.getTypeName(); String typeClassName = typeName.substring(14, typeName.length() - 1); Class<?> typeClass = Class.forName(typeClassName); Set collection = (Set) BeanUtilsBean.getInstance().getPropertyUtils().getProperty(bean, key); populateSet(collection, typeClass); } else if (fieldType == Map.class ) { Map<String, String> map = new LinkedHashMap<String, String>(); map.put("KEY-1", "VALUE-1"); map.put("KEY-2", "VALUE-2"); BeanUtils.setProperty(bean, key, map); } else if (fieldType.isEnum()) { BeanUtils.setProperty(bean, key, fieldType.getEnumConstants()[0]); } else if (fieldType.getPackage() != null && fieldType.getPackage().getName().startsWith("io.apiman.manager.api.beans")) { Object childBean = createBean(fieldType); BeanUtils.setProperty(bean, key, childBean); } else { throw new IllegalAccessException("Failed to handle property named [" + key + "] type: " + fieldType.getSimpleName()); } // String capKey = StringUtils.capitalize(key); // System.out.println(key);; } catch (NoSuchFieldException e) { // Skip it - there is not really a bean property with this name! } } return bean; } /** * Populate the given set with one or two items of the given type. * @param collection * @param typeClass */ private static void populateSet(Set collection, Class<?> typeClass) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, SecurityException, ClassNotFoundException { if (typeClass.isEnum()) { collection.add(typeClass.getEnumConstants()[0]); collection.add(typeClass.getEnumConstants()[1]); } else if (typeClass == String.class ) { collection.add("VALUE_1"); collection.add("VALUE_2"); } else if (typeClass.getPackage().getName().startsWith("io.apiman.manager.api.beans")) { Object bean1 = createBean(typeClass); Object bean2 = createBean(typeClass); collection.add(bean1); collection.add(bean2); } else { throw new IllegalAccessException("Failed to populate Set of type: " + typeClass.getSimpleName()); } } }