@Test(groups = "slow") public void testUserKey() throws Exception { tenantUserApi.addTenantKeyValue("THE_KEY", "TheValue", callContext); List<String> value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); tenantUserApi.addTenantKeyValue("THE_KEY", "TheSecondValue", callContext); value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 2); value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 2); tenantUserApi.deleteTenantKey("THE_KEY", callContext); value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 0); }
@Test(groups = "slow") public void testSystemKeyMultipleValue() throws Exception { final String tenantKey = TenantKey.CATALOG.toString(); tenantUserApi.addTenantKeyValue(tenantKey, "TheValue", callContext); List<String> value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); tenantUserApi.addTenantKeyValue(tenantKey, "TheSecondValue", callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 2); tenantUserApi.deleteTenantKey(tenantKey, callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); }
@Test(groups = "slow", description = "https://github.com/killbill/killbill/issues/297") public void testVerifyCacheOnAbsentValues() throws Exception { final String tenantKey = TenantKey.PLUGIN_CONFIG_.toString() + "MyPluginName"; // Warm the cache with the empty value List<String> value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); // Update the DAO directly (caching is done at the API layer) tenantDao.addTenantKeyValue(tenantKey, "TheValue-hidden!", true, internalCallContext); // Verify we still hit the cache value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); // Update the cache tenantUserApi.addTenantKeyValue(tenantKey, "TheValue", callContext); // Verify the cache now has the right value value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); }
@Test(groups = "slow") public void testSystemKeySingleValue() throws Exception { final String tenantKey = TenantKey.PLUGIN_CONFIG_.toString() + "MyPluginName"; tenantUserApi.addTenantKeyValue(tenantKey, "TheValue", callContext); List<String> value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); // Warm cache value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); tenantUserApi.addTenantKeyValue(tenantKey, "TheSecondValue", callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheSecondValue"); // Warm cache value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheSecondValue"); tenantUserApi.deleteTenantKey(tenantKey, callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); }
@Override public void uploadOverdueConfig(final String overdueXML, final CallContext callContext) throws OverdueApiException { try { final InternalTenantContext internalTenantContext = createInternalTenantContext(callContext); final String tenantKey = TenantKey.OVERDUE_CONFIG.toString(); if (!tenantApi.getTenantValuesForKey(tenantKey, callContext).isEmpty()) { tenantApi.deleteTenantKey(tenantKey, callContext); } tenantApi.addTenantKeyValue(tenantKey, overdueXML, callContext); overdueConfigCache.clearOverdueConfig(internalTenantContext); } catch (final TenantApiException e) { throw new OverdueApiException(e); } }
@TimedResource @GET @Path("/" + USER_KEY_VALUE + "/{keyName:" + ANYTHING_PATTERN + "}") @Produces(APPLICATION_JSON) @ApiOperation(value = "Retrieve a per tenant user key/value", response = TenantKeyValueJson.class) @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid tenantId supplied")}) public Response getUserKeyValue(@PathParam("keyName") final String key, @javax.ws.rs.core.Context final HttpServletRequest request) throws TenantApiException { final TenantContext tenantContext = context.createTenantContextNoAccountId(request); final List<String> values = tenantApi.getTenantValuesForKey(key, tenantContext); final TenantKeyValueJson result = new TenantKeyValueJson(key, values); return Response.status(Status.OK).entity(result).build(); }
private Response getTenantKey(final TenantKey key, @Nullable final String keyPostfix, final HttpServletRequest request) throws TenantApiException { final TenantContext tenantContext = context.createTenantContextNoAccountId(request); final String tenantKey = keyPostfix != null ? key.toString() + keyPostfix : key.toString(); final List<String> values = tenantApi.getTenantValuesForKey(tenantKey, tenantContext); final TenantKeyValueJson result = new TenantKeyValueJson(tenantKey, values); return Response.status(Status.OK).entity(result).build(); }
private Response getTemplateResource(@Nullable final String localeStr, final TenantKey tenantKey, final HttpServletRequest request) throws InvoiceApiException, TenantApiException { final TenantContext tenantContext = context.createTenantContextNoAccountId(request); final String tenantKeyStr = localeStr != null ? LocaleUtils.localeString(LocaleUtils.toLocale(localeStr), tenantKey.toString()) : tenantKey.toString(); final List<String> result = tenantApi.getTenantValuesForKey(tenantKeyStr, tenantContext); return result.isEmpty() ? Response.status(Status.NOT_FOUND).build() : Response.status(Status.OK).entity(result.get(0)).build(); }
protected String getTenantConfigurationAsString(@Nullable final UUID kbTenantId) { if (kbTenantId == null) { return null; } final TenantUserApi tenantUserApi = osgiKillbillAPI.getTenantUserApi(); if (tenantUserApi == null) { osgiKillbillLogService.log(LogService.LOG_WARNING, "Unable to retrieve TenantUserApi - skipping reconfiguration for key " + configKeyName); return null; } final TenantContext context = new PluginTenantContext(null, kbTenantId); try { final List<String> values = tenantUserApi.getTenantValuesForKey(configKeyName, context); return !values.isEmpty() ? values.get(0) : null; } catch (final TenantApiException e) { osgiKillbillLogService.log(LogService.LOG_WARNING, "Exception while retrieving configuration for key " + configKeyName, e); return null; } } }
private void mockTenantKvs(final UUID kbTenantIdA, final List<String> tenantKvsA, final UUID kbTenantIdB, final List<String> tenantKvsB) throws TenantApiException { Mockito.when(tenantUserApi.getTenantValuesForKey(Mockito.anyString(), Mockito.<TenantContext>any())).thenAnswer(new Answer<List<String>>() { @Override public List<String> answer(final InvocationOnMock invocation) throws Throwable { if (!"PLUGIN_CONFIG_test".equals(invocation.getArguments()[0])) { return ImmutableList.<String>of(); } final TenantContext context = (TenantContext) invocation.getArguments()[1]; if (kbTenantIdA.equals(context.getTenantId())) { return tenantKvsA; } else if (kbTenantIdB.equals(context.getTenantId())) { return tenantKvsB; } else { return ImmutableList.<String>of(); } } }); }
@Test(groups = "slow") public void testUserKey() throws Exception { tenantUserApi.addTenantKeyValue("THE_KEY", "TheValue", callContext); List<String> value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); tenantUserApi.addTenantKeyValue("THE_KEY", "TheSecondValue", callContext); value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 2); value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 2); tenantUserApi.deleteTenantKey("THE_KEY", callContext); value = tenantUserApi.getTenantValuesForKey("THE_KEY", callContext); Assert.assertEquals(value.size(), 0); }
@Test(groups = "slow") public void testSystemKeyMultipleValue() throws Exception { final String tenantKey = TenantKey.CATALOG.toString(); tenantUserApi.addTenantKeyValue(tenantKey, "TheValue", callContext); List<String> value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); tenantUserApi.addTenantKeyValue(tenantKey, "TheSecondValue", callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 2); tenantUserApi.deleteTenantKey(tenantKey, callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); }
@Test(groups = "slow") public void testSystemKeySingleValue() throws Exception { final String tenantKey = TenantKey.PLUGIN_CONFIG_.toString() + "MyPluginName"; tenantUserApi.addTenantKeyValue(tenantKey, "TheValue", callContext); List<String> value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); // Warm cache value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); tenantUserApi.addTenantKeyValue(tenantKey, "TheSecondValue", callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheSecondValue"); // Warm cache value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheSecondValue"); tenantUserApi.deleteTenantKey(tenantKey, callContext); value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); }
@Test(groups = "slow", description = "https://github.com/killbill/killbill/issues/297") public void testVerifyCacheOnAbsentValues() throws Exception { final String tenantKey = TenantKey.PLUGIN_CONFIG_.toString() + "MyPluginName"; // Warm the cache with the empty value List<String> value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); // Update the DAO directly (caching is done at the API layer) tenantDao.addTenantKeyValue(tenantKey, "TheValue-hidden!", true, internalCallContext); // Verify we still hit the cache value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 0); // Update the cache tenantUserApi.addTenantKeyValue(tenantKey, "TheValue", callContext); // Verify the cache now has the right value value = tenantUserApi.getTenantValuesForKey(tenantKey, callContext); Assert.assertEquals(value.size(), 1); Assert.assertEquals(value.get(0), "TheValue"); }
if (!tenantApi.getTenantValuesForKey(tenantKeyStr, callContext).isEmpty()) { if (deleteIfExists) { tenantApi.deleteTenantKey(tenantKeyStr, callContext);
@Override public void uploadOverdueConfig(final String overdueXML, final CallContext callContext) throws OverdueApiException { try { final InternalTenantContext internalTenantContext = createInternalTenantContext(callContext); final String tenantKey = TenantKey.OVERDUE_CONFIG.toString(); if (!tenantApi.getTenantValuesForKey(tenantKey, callContext).isEmpty()) { tenantApi.deleteTenantKey(tenantKey, callContext); } tenantApi.addTenantKeyValue(tenantKey, overdueXML, callContext); overdueConfigCache.clearOverdueConfig(internalTenantContext); } catch (final TenantApiException e) { throw new OverdueApiException(e); } }