@CliCommand(value = CliStrings.LIST_INDEX, help = CliStrings.LIST_INDEX__HELP) @CliMetaData(shellOnly = false, relatedTopic={CliStrings.TOPIC_GEMFIRE_REGION, CliStrings.TOPIC_GEMFIRE_DATA}) public Result listIndex(@CliOption(key = CliStrings.LIST_INDEX__STATS, mandatory = false, specifiedDefaultValue = "true", unspecifiedDefaultValue = "false", help = CliStrings.LIST_INDEX__STATS__HELP) final boolean showStats) { try { return toTabularResult(getIndexListing(), showStats); } catch (FunctionInvocationTargetException ignore) { return ResultBuilder.createGemFireErrorResult(CliStrings.format(CliStrings.COULD_NOT_EXECUTE_COMMAND_TRY_AGAIN, CliStrings.LIST_INDEX)); } catch (VirtualMachineError e) { SystemFailure.initiateFailure(e); throw e; } catch (Throwable t) { SystemFailure.checkFailure(); getCache().getLogger().error(t); return ResultBuilder.createGemFireErrorResult(String.format(CliStrings.LIST_INDEX__ERROR_MESSAGE, toString(t, isDebugging()))); } }
@SuppressWarnings("unchecked") protected List<IndexDetails> getIndexListing() { final Execution functionExecutor = getMembersFunctionExecutor(getMembers(getCache())); if (functionExecutor instanceof AbstractExecution) { ((AbstractExecution) functionExecutor).setIgnoreDepartedMembers(true); } final ResultCollector<?, ?> resultsCollector = functionExecutor.execute(new ListIndexFunction()); final List<?> results = (List<?>) resultsCollector.getResult(); final List<IndexDetails> indexDetailsList = new ArrayList<IndexDetails>(results.size()); for (Object result : results) { if (result instanceof Set) { // ignore FunctionInvocationTargetExceptions and other Exceptions indexDetailsList.addAll((Set<IndexDetails>) result); } } Collections.sort(indexDetailsList); return indexDetailsList; }
@Test(expected = RuntimeException.class) public void testGetIndexListingThrowsRuntimeException() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final Execution mockFunctionExecutor = mockContext.mock(Execution.class, "Function Executor"); mockContext.checking(new Expectations() {{ oneOf(mockFunctionExecutor).execute(with(aNonNull(ListIndexFunction.class))); will(throwException(new RuntimeException("expected"))); }}); final IndexCommands commands = createIndexCommands(mockCache, mockFunctionExecutor); try { commands.getIndexListing(); } catch (RuntimeException expected) { assertEquals("expected", expected.getMessage()); throw expected; } }
@Test public void testGetIndexListingReturnsFunctionInvocationTargetExceptionInResults() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final AbstractExecution mockFunctionExecutor = mockContext.mock(AbstractExecution.class, "Function Executor"); final ResultCollector mockResultCollector = mockContext.mock(ResultCollector.class, "ResultCollector"); final IndexDetails indexDetails = createIndexDetails("memberOne", "/Employees", "empIdIdx"); final List<IndexDetails> expectedIndexDetails = Arrays.asList(indexDetails); final List<Object> results = new ArrayList<Object>(2); results.add(CollectionUtils.asSet(indexDetails)); results.add(new FunctionInvocationTargetException("expected")); mockContext.checking(new Expectations() {{ oneOf(mockFunctionExecutor).setIgnoreDepartedMembers(with(equal(true))); oneOf(mockFunctionExecutor).execute(with(aNonNull(ListIndexFunction.class))); will(returnValue(mockResultCollector)); oneOf(mockResultCollector).getResult(); will(returnValue(results)); }}); final IndexCommands commands = createIndexCommands(mockCache, mockFunctionExecutor); final List<IndexDetails> actualIndexDetails = commands.getIndexListing(); assertNotNull(actualIndexDetails); assertEquals(expectedIndexDetails, actualIndexDetails); }
@CliCommand(value = CliStrings.LIST_INDEX, help = CliStrings.LIST_INDEX__HELP) @CliMetaData(shellOnly = false, relatedTopic={CliStrings.TOPIC_GEMFIRE_REGION, CliStrings.TOPIC_GEMFIRE_DATA}) public Result listIndex(@CliOption(key = CliStrings.LIST_INDEX__STATS, mandatory = false, specifiedDefaultValue = "true", unspecifiedDefaultValue = "false", help = CliStrings.LIST_INDEX__STATS__HELP) final boolean showStats) { try { return toTabularResult(getIndexListing(), showStats); } catch (FunctionInvocationTargetException ignore) { return ResultBuilder.createGemFireErrorResult(CliStrings.format(CliStrings.COULD_NOT_EXECUTE_COMMAND_TRY_AGAIN, CliStrings.LIST_INDEX)); } catch (VirtualMachineError e) { SystemFailure.initiateFailure(e); throw e; } catch (Throwable t) { SystemFailure.checkFailure(); getCache().getLogger().error(t); return ResultBuilder.createGemFireErrorResult(String.format(CliStrings.LIST_INDEX__ERROR_MESSAGE, toString(t, isDebugging()))); } }
@SuppressWarnings("unchecked") protected List<IndexDetails> getIndexListing() { final Execution functionExecutor = getMembersFunctionExecutor(getMembers(getCache())); if (functionExecutor instanceof AbstractExecution) { ((AbstractExecution) functionExecutor).setIgnoreDepartedMembers(true); } final ResultCollector<?, ?> resultsCollector = functionExecutor.execute(new ListIndexFunction()); final List<?> results = (List<?>) resultsCollector.getResult(); final List<IndexDetails> indexDetailsList = new ArrayList<IndexDetails>(results.size()); for (Object result : results) { if (result instanceof Set) { // ignore FunctionInvocationTargetExceptions and other Exceptions indexDetailsList.addAll((Set<IndexDetails>) result); } } Collections.sort(indexDetailsList); return indexDetailsList; }
@Test public void testGetIndexListing() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final AbstractExecution mockFunctionExecutor = mockContext.mock(AbstractExecution.class, "Function Executor"); final ResultCollector mockResultCollector = mockContext.mock(ResultCollector.class, "ResultCollector"); final IndexDetails indexDetails1 = createIndexDetails("memberOne", "/Employees", "empIdIdx"); final IndexDetails indexDetails2 = createIndexDetails("memberOne", "/Employees", "empLastNameIdx"); final IndexDetails indexDetails3 = createIndexDetails("memberTwo", "/Employees", "empDobIdx"); final List<IndexDetails> expectedIndexDetails = Arrays.asList(indexDetails1, indexDetails2, indexDetails3); final List<Set<IndexDetails>> results = new ArrayList<Set<IndexDetails>>(2); results.add(CollectionUtils.asSet(indexDetails2, indexDetails1)); results.add(CollectionUtils.asSet(indexDetails3)); mockContext.checking(new Expectations() {{ oneOf(mockFunctionExecutor).setIgnoreDepartedMembers(with(equal(true))); oneOf(mockFunctionExecutor).execute(with(aNonNull(ListIndexFunction.class))); will(returnValue(mockResultCollector)); oneOf(mockResultCollector).getResult(); will(returnValue(results)); }}); final IndexCommands commands = createIndexCommands(mockCache, mockFunctionExecutor); final List<IndexDetails> actualIndexDetails = commands.getIndexListing(); assertNotNull(actualIndexDetails); assertEquals(expectedIndexDetails, actualIndexDetails); }