This is an automated email from the ASF dual-hosted git repository. prhomberg pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push: new df093b5 GEODE-4722: Refactor CliUtil (#1487) df093b5 is described below commit df093b5b8f2d1bee549e0b76472b4fcdd51ddc7f Author: Patrick Rhomberg <prhomb...@pivotal.io> AuthorDate: Fri Feb 23 10:03:45 2018 -0800 GEODE-4722: Refactor CliUtil (#1487) * Reorder methods, grouped by similar functionality. * Replace .stackTraceToString and .contains with Apache Commons methods. * Moved getClientIdFromCacheClientProxy to only class that calls it. * Move arrayToString from CliUtil to sensible StringUtils. Moved associated test. * Refactor CliUtil methods. --- .../jdbc/internal/cli/ExceptionHandler.java | 3 +- .../distributed/internal/InternalLocator.java | 5 +- .../geode/internal/admin/ClientStatsManager.java | 5 +- .../apache/geode/internal/lang/StringUtils.java | 13 + .../internal/beans/CacheServerBridge.java | 16 +- .../geode/management/internal/cli/CliUtil.java | 653 +++++++++------------ .../internal/cli/CommandResponseBuilder.java | 4 +- .../geode/management/internal/cli/Launcher.java | 7 +- .../cli/commands/CompactDiskStoreCommand.java | 3 +- .../commands/CompactOfflineDiskStoreCommand.java | 3 +- .../internal/cli/commands/CreateRegionCommand.java | 6 +- .../cli/commands/DescribeMemberCommand.java | 5 +- .../cli/commands/DescribeRegionCommand.java | 5 +- .../commands/UpgradeOfflineDiskStoreCommand.java | 3 +- .../internal/cli/domain/RegionAttributesInfo.java | 3 +- .../cli/functions/AlterRuntimeConfigFunction.java | 4 +- .../cli/functions/GarbageCollectionFunction.java | 5 +- .../cli/functions/RegionAlterFunction.java | 3 +- .../cli/functions/RegionCreateFunction.java | 3 +- .../geode/management/internal/cli/shell/Gfsh.java | 2 +- .../internal/cli/util/DiskStoreCompacter.java | 13 +- .../internal/cli/util/DiskStoreUpgrader.java | 13 +- .../geode/internal/lang/StringUtilsJUnitTest.java | 11 + .../geode/management/internal/cli/CliUtilTest.java | 11 - .../cli/commands/ClientCommandsTestUtils.java | 5 +- .../commands/DescribeClientCommandDUnitTest.java | 14 +- .../cli/commands/ListClientCommandDUnitTest.java | 7 +- 27 files changed, 392 insertions(+), 433 deletions(-) diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ExceptionHandler.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ExceptionHandler.java index 0909d7a..59b4a6a 100644 --- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ExceptionHandler.java +++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/ExceptionHandler.java @@ -16,6 +16,7 @@ package org.apache.geode.connectors.jdbc.internal.cli; import java.io.Serializable; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.logging.log4j.Logger; import org.apache.geode.cache.Cache; @@ -51,7 +52,7 @@ class ExceptionHandler implements Serializable { private String getExceptionMessage(final Exception exception) { String message = exception.getMessage(); if (message == null) { - message = CliUtil.stackTraceAsString(exception); + message = ExceptionUtils.getStackTrace(exception); } return message; } diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java index 8608b5c..7c7b5af 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java @@ -34,6 +34,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.logging.log4j.Logger; import org.apache.geode.CancelException; @@ -75,7 +76,6 @@ import org.apache.geode.internal.net.SocketCreator; import org.apache.geode.internal.net.SocketCreatorFactory; import org.apache.geode.management.internal.JmxManagerLocator; import org.apache.geode.management.internal.JmxManagerLocatorRequest; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.configuration.domain.SharedConfigurationStatus; import org.apache.geode.management.internal.configuration.handlers.SharedConfigurationStatusRequestHandler; import org.apache.geode.management.internal.configuration.messages.SharedConfigurationStatusRequest; @@ -1123,7 +1123,8 @@ public class InternalLocator extends Locator implements ConnectListener { try { response = statusFuture.get(5, TimeUnit.SECONDS); } catch (Exception e) { - logger.info("Exception occurred while fetching the status {}", CliUtil.stackTraceAsString(e)); + logger.info("Exception occurred while fetching the status {}", + ExceptionUtils.getStackTrace(e)); response = new SharedConfigurationStatusResponse(); response.setStatus(SharedConfigurationStatus.UNDETERMINED); } diff --git a/geode-core/src/main/java/org/apache/geode/internal/admin/ClientStatsManager.java b/geode-core/src/main/java/org/apache/geode/internal/admin/ClientStatsManager.java index 38b7122..c333906 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/admin/ClientStatsManager.java +++ b/geode-core/src/main/java/org/apache/geode/internal/admin/ClientStatsManager.java @@ -18,6 +18,8 @@ import java.util.Date; import java.util.Map; import java.util.Map.Entry; +import org.apache.commons.lang.exception.ExceptionUtils; + import org.apache.geode.Statistics; import org.apache.geode.StatisticsType; import org.apache.geode.cache.CacheWriterException; @@ -34,7 +36,6 @@ import org.apache.geode.internal.cache.GemFireCacheImpl; import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.internal.i18n.LocalizedStrings; import org.apache.geode.internal.offheap.annotations.Released; -import org.apache.geode.management.internal.cli.CliUtil; /** * This class publishes the client statistics using the admin region. @@ -255,7 +256,7 @@ public class ClientStatsManager { } catch (Exception e) { logger.fine("Exception in getting pool stats in getClientHealthStats " - + CliUtil.stackTraceAsString(e)); + + ExceptionUtils.getStackTrace(e)); } stats.setUpdateTime(new Date()); diff --git a/geode-core/src/main/java/org/apache/geode/internal/lang/StringUtils.java b/geode-core/src/main/java/org/apache/geode/internal/lang/StringUtils.java index 298f44f..5930e6e 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/lang/StringUtils.java +++ b/geode-core/src/main/java/org/apache/geode/internal/lang/StringUtils.java @@ -15,6 +15,9 @@ package org.apache.geode.internal.lang; +import java.util.Arrays; +import java.util.stream.Collectors; + import org.apache.geode.internal.cache.CachedDeserializable; import org.apache.geode.internal.cache.Token; @@ -192,6 +195,16 @@ public class StringUtils extends org.apache.commons.lang.StringUtils { } } + /** + * Unlike the other arrayToString methods in this class, this method does not surround + * the array with "[" "]" delimiters. + */ + public static <T> String arrayToString(T[] array) { + if (array == null) { + return "null"; + } + return Arrays.stream(array).map(String::valueOf).collect(Collectors.joining(", ")); + } private static <T> String arrayToString(T[] a, int maxArrayElements) { if (maxArrayElements < 0) { diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/beans/CacheServerBridge.java b/geode-core/src/main/java/org/apache/geode/management/internal/beans/CacheServerBridge.java index efb9425..e17abf6 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/beans/CacheServerBridge.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/beans/CacheServerBridge.java @@ -62,7 +62,6 @@ import org.apache.geode.management.internal.beans.stats.StatType; import org.apache.geode.management.internal.beans.stats.StatsAverageLatency; import org.apache.geode.management.internal.beans.stats.StatsKey; import org.apache.geode.management.internal.beans.stats.StatsRate; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.membership.ClientMembershipListener; /** @@ -713,7 +712,7 @@ public class CacheServerBridge extends ServerBridge { if (!p.isConnected() && !proxyID.isDurable()) { return null; } - queueDetail.setClientId(CliUtil.getClientIdFromCacheClientProxy(p)); + queueDetail.setClientId(getClientIdFromCacheClientProxy(p)); HARegionQueue queue = p.getHARegionQueue(); if (queue == null) { @@ -737,7 +736,7 @@ public class CacheServerBridge extends ServerBridge { Collection<CacheClientProxy> clientProxies = acceptor.getCacheClientNotifier().getClientProxies(); for (CacheClientProxy p : clientProxies) { - String buffer = CliUtil.getClientIdFromCacheClientProxy(p); + String buffer = getClientIdFromCacheClientProxy(p); if (buffer.equals(clientId)) { ClientQueueDetail queueDetail = getClientQueueDetail(p); return queueDetail; @@ -750,4 +749,15 @@ public class CacheServerBridge extends ServerBridge { return null; } + + private static String getClientIdFromCacheClientProxy(CacheClientProxy p) { + if (p == null) { + return null; + } + StringBuffer buffer = new StringBuffer(); + buffer.append("[").append(p.getProxyID()).append(":port=").append(p.getRemotePort()) + .append(":primary=").append(p.isPrimary()).append("]"); + return buffer.toString(); + } + } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java index ed6ee28..b57bc90 100755 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CliUtil.java @@ -23,17 +23,16 @@ import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; -import java.io.PrintWriter; import java.io.Serializable; -import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.charset.Charset; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.zip.DataFormatException; @@ -55,7 +54,6 @@ import org.apache.geode.distributed.internal.InternalDistributedSystem; import org.apache.geode.internal.ClassPathLoader; import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.internal.cache.execute.AbstractExecution; -import org.apache.geode.internal.cache.tier.sockets.CacheClientProxy; import org.apache.geode.internal.util.IOUtils; import org.apache.geode.management.DistributedRegionMXBean; import org.apache.geode.management.ManagementService; @@ -76,136 +74,154 @@ import org.apache.geode.management.internal.cli.shell.Gfsh; public class CliUtil { public static final FileFilter JAR_FILE_FILTER = new CustomFileFilter(".jar"); - public static String cliDependenciesExist(boolean includeGfshDependencies) { - String jarProductName; - - // Parser & CliCommand from Spring Shell - jarProductName = - checkLibraryByLoadingClass("org.springframework.shell.core.Parser", "Spring Shell"); - jarProductName = checkLibraryByLoadingClass( - "org.springframework.shell.core.annotation.CliCommand", "Spring Shell"); - if (jarProductName != null) { - return jarProductName; + public static InternalCache getCacheIfExists() { + InternalCache cache; + try { + cache = getInternalCache(); + } catch (CacheClosedException e) { + // ignore & return null + cache = null; } - // SpringVersion from Spring Core - jarProductName = - checkLibraryByLoadingClass("org.springframework.core.SpringVersion", "Spring Core"); - if (jarProductName != null) { - return jarProductName; - } + return cache; + } + public static String cliDependenciesExist(boolean includeGfshDependencies) { + // "Validate" each dependency by attempting to load an associated class + Map<String, String> classLibraryMap = new HashMap<>(); + classLibraryMap.put("org.springframework.shell.core.Parser", "Spring Shell"); + classLibraryMap.put("org.springframework.shell.core.annotation.CliCommand", "Spring Shell"); + classLibraryMap.put("org.springframework.core.SpringVersion", "Spring Core"); if (includeGfshDependencies) { - // ConsoleReader from jline - jarProductName = checkLibraryByLoadingClass("jline.console.ConsoleReader", "JLine"); - if (jarProductName != null) { - return jarProductName; - } + classLibraryMap.put("jline.console.ConsoleReader", "JLine"); } - return jarProductName; + List<String> unloadableJars = + classLibraryMap.entrySet().stream().filter(entry -> !canLoadClass(entry.getKey())) + .map(Map.Entry::getValue).collect(Collectors.toList()); + return unloadableJars.isEmpty() ? null : String.join(",", unloadableJars); } - private static String checkLibraryByLoadingClass(String className, String jarProductName) { + private static boolean canLoadClass(String className) { try { ClassPathLoader.getLatest().forName(className); } catch (ClassNotFoundException e) { - return jarProductName; - } - - return null; - } - - public static InternalCache getCacheIfExists() { - InternalCache cache; - try { - cache = getInternalCache(); - } catch (CacheClosedException e) { - // ignore & return null - cache = null; + return false; } - - return cache; + return true; } /** - * Even thought this is only used in a test, caller of MemberMXBean.processCommand(String, Map, - * Byte[][]) will need to use this method to convert a fileList to Byte[][] to call that - * deprecated API. + * Returns a Set of DistributedMember for members that have the specified <code>region</code>. + * <code>returnAll</code> indicates whether to return all members or only the first member we + * find. * - * Once that deprecated API is removed, we can delete this method and the tests. + * @param region region path for which members that have this region are required + * @param cache cache instance to use to find members + * @param returnAll if true, returns all matching members, else returns only first one found. + * @return a Set of DistributedMember for members that have the specified <code>region</code>. */ - public static Byte[][] filesToBytes(List<String> fileNames) throws IOException { - List<byte[]> filesDataList = new ArrayList<>(); + public static Set<DistributedMember> getRegionAssociatedMembers(String region, + final InternalCache cache, boolean returnAll) { + if (region == null || region.isEmpty()) { + return Collections.emptySet(); + } - for (String fileName : fileNames) { - File file = new File(fileName); + if (!region.startsWith(Region.SEPARATOR)) { + region = Region.SEPARATOR + region; + } - if (!file.exists()) { - throw new FileNotFoundException("Could not find " + file.getCanonicalPath()); - } + DistributedRegionMXBean regionMXBean = + ManagementService.getManagementService(cache).getDistributedRegionMXBean(region); - if (file.isDirectory()) { - File[] childrenFiles = file.listFiles(JAR_FILE_FILTER); - for (File childrenFile : childrenFiles) { - // 1. add name of the file as bytes at even index - filesDataList.add(childrenFile.getName().getBytes()); - // 2. add file contents as bytes at odd index - filesDataList.add(toByteArray(new FileInputStream(childrenFile))); + if (regionMXBean == null) { + return Collections.emptySet(); + } + + String[] regionAssociatedMemberNames = regionMXBean.getMembers(); + Set<DistributedMember> matchedMembers = new HashSet<>(); + Set<DistributedMember> allClusterMembers = new HashSet<>(cache.getMembers()); + allClusterMembers.add(cache.getDistributedSystem().getDistributedMember()); + + for (DistributedMember member : allClusterMembers) { + for (String regionAssociatedMemberName : regionAssociatedMemberNames) { + String name = MBeanJMXAdapter.getMemberNameOrId(member); + if (name.equals(regionAssociatedMemberName)) { + matchedMembers.add(member); + if (!returnAll) { + return matchedMembers; + } } - } else { - filesDataList.add(file.getName().getBytes()); - filesDataList.add(toByteArray(new FileInputStream(file))); } } + return matchedMembers; + } + + /** + * this finds the member that hosts all the regions passed in. + * + * @param returnAll if true, returns all matching members, otherwise, returns only one. + */ + public static Set<DistributedMember> getQueryRegionsAssociatedMembers(Set<String> regions, + final InternalCache cache, boolean returnAll) { + Set<DistributedMember> results = regions.stream() + .map(region -> getRegionAssociatedMembers(region, cache, true)).reduce((s1, s2) -> { + s1.retainAll(s2); + return s1; + }).get(); - List<Byte[]> convertedList = - filesDataList.stream().map(ArrayUtils::toObject).collect(Collectors.toList()); + if (returnAll || results.size() <= 1) { + return results; + } - return convertedList.toArray(new Byte[convertedList.size()][]); + // returns a set of only one item + return Collections.singleton(results.iterator().next()); } - public static byte[] toByteArray(InputStream input) throws IOException { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - int n = 0; - byte[] buffer = new byte[4096]; - while (-1 != (n = input.read(buffer))) { - output.write(buffer, 0, n); + public static String getMemberNameOrId(DistributedMember distributedMember) { + String nameOrId = null; + if (distributedMember != null) { + nameOrId = distributedMember.getName(); + nameOrId = nameOrId != null && !nameOrId.isEmpty() ? nameOrId : distributedMember.getId(); } + return nameOrId; + } - return output.toByteArray(); + /** + * Returns a set of all the members of the distributed system excluding locators. + */ + @SuppressWarnings("unchecked") + public static Set<DistributedMember> getAllNormalMembers(InternalCache cache) { + return new HashSet<DistributedMember>(cache.getInternalDistributedSystem() + .getDistributionManager().getNormalDistributionManagerIds()); } - public static List<String> bytesToFiles(Byte[][] fileData, String parentDirPath) - throws IOException, UnsupportedOperationException { - List<String> filesPaths = new ArrayList<>(); - FileOutputStream fos = null; - File file = null; + /** + * Returns a set of all the members of the distributed system including locators. + */ + @SuppressWarnings("unchecked") + public static Set<DistributedMember> getAllMembers(InternalCache cache) { + return getAllMembers(cache.getInternalDistributedSystem()); + } - File parentDir = new File(parentDirPath); - if (!parentDir.exists() && !parentDir.mkdirs()) { - throw new UnsupportedOperationException( - "Couldn't create required directory structure for " + parentDirPath); - } - for (int i = 0; i < fileData.length; i++) { - byte[] bytes = ArrayUtils.toPrimitive(fileData[i]); - if (i % 2 == 0) { - // Expect file name as bytes at even index - String fileName = new String(bytes); - file = new File(parentDir, fileName); - fos = new FileOutputStream(file); - } else { - // Expect file contents as bytes at odd index - fos.write(bytes); - fos.close(); - filesPaths.add(file.getAbsolutePath()); - } - } - return filesPaths; + @SuppressWarnings("unchecked") + public static Set<DistributedMember> getAllMembers(InternalDistributedSystem internalDS) { + return new HashSet<DistributedMember>( + internalDS.getDistributionManager().getDistributionManagerIds()); } - private static InternalCache getInternalCache() { - return (InternalCache) CacheFactory.getAnyInstance(); + public static Set<DistributedMember> getMembersWithAsyncEventQueue(InternalCache cache, + String queueId) { + Set<DistributedMember> members = findMembers(null, null); + return members.stream().filter(m -> getAsyncEventQueueIds(cache, m).contains(queueId)) + .collect(Collectors.toSet()); + } + + public static Set<String> getAsyncEventQueueIds(InternalCache cache, DistributedMember member) { + SystemManagementService managementService = + (SystemManagementService) ManagementService.getExistingManagementService(cache); + return managementService.getAsyncEventQueueMBeanNames(member).stream() + .map(x -> x.getKeyProperty("queue")).collect(Collectors.toSet()); } public static Set<String> getAllRegionNames() { @@ -225,30 +241,6 @@ public class CliUtil { return regionNames; } - public static String convertStringSetToString(Set<String> stringSet, char delimiter) { - StringBuilder sb = new StringBuilder(); - if (stringSet != null) { - - for (String stringValue : stringSet) { - sb.append(stringValue); - sb.append(delimiter); - } - } - return sb.toString(); - } - - public static String convertStringListToString(List<String> stringList, char delimiter) { - StringBuilder sb = new StringBuilder(); - if (stringList != null) { - - for (String stringValue : stringList) { - sb.append(stringValue); - sb.append(delimiter); - } - } - return sb.toString(); - } - /** * Finds all Members (including both servers and locators) which belong to the given arrays of * groups or members. @@ -328,104 +320,77 @@ public class CliUtil { return memberFound; } - public static String stackTraceAsString(Throwable e) { - String stackAsString = ""; - if (e != null) { - StringWriter writer = new StringWriter(); - PrintWriter pw = new PrintWriter(writer); - e.printStackTrace(pw); - stackAsString = writer.toString(); - } - return stackAsString; - } + /** + * Even thought this is only used in a test, caller of MemberMXBean.processCommand(String, Map, + * Byte[][]) will need to use this method to convert a fileList to Byte[][] to call that + * deprecated API. + * + * Once that deprecated API is removed, we can delete this method and the tests. + */ + public static Byte[][] filesToBytes(List<String> fileNames) throws IOException { + List<byte[]> filesDataList = new ArrayList<>(); - @SuppressWarnings("unchecked") - public static <K> Class<K> forName(String classToLoadName, String neededFor) { - Class<K> loadedClass = null; - try { - // Set Constraints - ClassPathLoader classPathLoader = ClassPathLoader.getLatest(); - if (classToLoadName != null && !classToLoadName.isEmpty()) { - loadedClass = (Class<K>) classPathLoader.forName(classToLoadName); + for (String fileName : fileNames) { + File file = new File(fileName); + + if (!file.exists()) { + throw new FileNotFoundException("Could not find " + file.getCanonicalPath()); + } + + if (file.isDirectory()) { + File[] childrenFiles = file.listFiles(JAR_FILE_FILTER); + for (File childrenFile : childrenFiles) { + // 1. add name of the file as bytes at even index + filesDataList.add(childrenFile.getName().getBytes()); + // 2. add file contents as bytes at odd index + filesDataList.add(toByteArray(new FileInputStream(childrenFile))); + } + } else { + filesDataList.add(file.getName().getBytes()); + filesDataList.add(toByteArray(new FileInputStream(file))); } - } catch (ClassNotFoundException | NoClassDefFoundError e) { - throw new RuntimeException( - CliStrings.format(CliStrings.CREATE_REGION__MSG__COULD_NOT_FIND_CLASS_0_SPECIFIED_FOR_1, - classToLoadName, neededFor), - e); - } catch (ClassCastException e) { - throw new RuntimeException(CliStrings.format( - CliStrings.CREATE_REGION__MSG__CLASS_SPECIFIED_FOR_0_SPECIFIED_FOR_1_IS_NOT_OF_EXPECTED_TYPE, - classToLoadName, neededFor), e); } - return loadedClass; + return filesDataList.stream().map(ArrayUtils::toObject).toArray(Byte[][]::new); } - public static <K> K newInstance(Class<K> klass, String neededFor) { - K instance; - try { - instance = klass.newInstance(); - } catch (InstantiationException e) { - throw new RuntimeException(CliStrings.format( - CliStrings.CREATE_REGION__MSG__COULD_NOT_INSTANTIATE_CLASS_0_SPECIFIED_FOR_1, klass, - neededFor), e); - } catch (IllegalAccessException e) { - throw new RuntimeException( - CliStrings.format(CliStrings.CREATE_REGION__MSG__COULD_NOT_ACCESS_CLASS_0_SPECIFIED_FOR_1, - klass, neededFor), - e); + public static byte[] toByteArray(InputStream input) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + int n; + byte[] buffer = new byte[4096]; + while (-1 != (n = input.read(buffer))) { + output.write(buffer, 0, n); } - return instance; + return output.toByteArray(); } - public static Result getFunctionResult(ResultCollector<?, ?> rc, String commandName) { - Result result; - List<Object> results = (List<Object>) rc.getResult(); - if (results != null) { - Object resultObj = results.get(0); - if (resultObj instanceof String) { - result = ResultBuilder.createInfoResult((String) resultObj); - } else if (resultObj instanceof Exception) { - result = ResultBuilder.createGemFireErrorResult(((Exception) resultObj).getMessage()); - } else { - result = ResultBuilder.createGemFireErrorResult( - CliStrings.format(CliStrings.COMMAND_FAILURE_MESSAGE, commandName)); - } - } else { - result = ResultBuilder.createGemFireErrorResult( - CliStrings.format(CliStrings.COMMAND_FAILURE_MESSAGE, commandName)); - } - return result; - } - - public static Set<DistributedMember> getMembersWithAsyncEventQueue(InternalCache cache, - String queueId) { - Set<DistributedMember> members = findMembers(null, null); - return members.stream().filter(m -> getAsyncEventQueueIds(cache, m).contains(queueId)) - .collect(Collectors.toSet()); - } - - public static Set<String> getAsyncEventQueueIds(InternalCache cache, DistributedMember member) { - SystemManagementService managementService = - (SystemManagementService) ManagementService.getExistingManagementService(cache); - return managementService.getAsyncEventQueueMBeanNames(member).stream() - .map(x -> x.getKeyProperty("queue")).collect(Collectors.toSet()); - } - - static class CustomFileFilter implements FileFilter { - private String extensionWithDot; + public static List<String> bytesToFiles(Byte[][] fileData, String parentDirPath) + throws IOException, UnsupportedOperationException { + List<String> filesPaths = new ArrayList<>(); + FileOutputStream fos = null; + File file = null; - public CustomFileFilter(String extensionWithDot) { - this.extensionWithDot = extensionWithDot; + File parentDir = new File(parentDirPath); + if (!parentDir.exists() && !parentDir.mkdirs()) { + throw new UnsupportedOperationException( + "Couldn't create required directory structure for " + parentDirPath); } - - @Override - public boolean accept(File pathname) { - String name = pathname.getName(); - return name.endsWith(extensionWithDot); + for (int i = 0; i < fileData.length; i++) { + byte[] bytes = ArrayUtils.toPrimitive(fileData[i]); + if (i % 2 == 0) { + // Expect file name as bytes at even index + String fileName = new String(bytes); + file = new File(parentDir, fileName); + fos = new FileOutputStream(file); + } else { + // Expect file contents as bytes at odd index + fos.write(bytes); + fos.close(); + filesPaths.add(file.getAbsolutePath()); + } } + return filesPaths; } public static DeflaterInflaterData compressBytes(byte[] input) { @@ -434,7 +399,7 @@ public class CliUtil { compresser.finish(); byte[] buffer = new byte[100]; byte[] result = new byte[0]; - int compressedDataLength = 0; + int compressedDataLength; int totalCompressedDataLength = 0; do { byte[] newResult = new byte[result.length + buffer.length]; @@ -467,66 +432,84 @@ public class CliUtil { return new DeflaterInflaterData(result.length, result); } - public static class DeflaterInflaterData implements Serializable { - private static final long serialVersionUID = 1104813333595216795L; - - private final int dataLength; - private final byte[] data; - - public DeflaterInflaterData(int dataLength, byte[] data) { - this.dataLength = dataLength; - this.data = data; - } - - public int getDataLength() { - return dataLength; + public static String decodeWithDefaultCharSet(String urlToDecode) { + try { + return URLDecoder.decode(urlToDecode, Charset.defaultCharset().name()); + } catch (UnsupportedEncodingException e) { + return urlToDecode; } + } - public byte[] getData() { - return data; + public static <K> Class<K> forName(String classToLoadName, String neededFor) { + Class<K> loadedClass = null; + try { + // Set Constraints + ClassPathLoader classPathLoader = ClassPathLoader.getLatest(); + if (classToLoadName != null && !classToLoadName.isEmpty()) { + loadedClass = (Class<K>) classPathLoader.forName(classToLoadName); + } + } catch (ClassNotFoundException | NoClassDefFoundError e) { + throw new RuntimeException( + CliStrings.format(CliStrings.CREATE_REGION__MSG__COULD_NOT_FIND_CLASS_0_SPECIFIED_FOR_1, + classToLoadName, neededFor), + e); + } catch (ClassCastException e) { + throw new RuntimeException(CliStrings.format( + CliStrings.CREATE_REGION__MSG__CLASS_SPECIFIED_FOR_0_SPECIFIED_FOR_1_IS_NOT_OF_EXPECTED_TYPE, + classToLoadName, neededFor), e); } - @Override - public String toString() { - return String.valueOf(dataLength); - } + return loadedClass; } - public static boolean contains(Object[] array, Object object) { - boolean contains = false; - - if (array != null && object != null) { - contains = Arrays.asList(array).contains(object); + public static <K> K newInstance(Class<K> klass, String neededFor) { + K instance; + try { + instance = klass.newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException(CliStrings.format( + CliStrings.CREATE_REGION__MSG__COULD_NOT_INSTANTIATE_CLASS_0_SPECIFIED_FOR_1, klass, + neededFor), e); + } catch (IllegalAccessException e) { + throw new RuntimeException( + CliStrings.format(CliStrings.CREATE_REGION__MSG__COULD_NOT_ACCESS_CLASS_0_SPECIFIED_FOR_1, + klass, neededFor), + e); } - return contains; - } - - /** - * Returns a set of all the members of the distributed system excluding locators. - * - * @param cache - */ - @SuppressWarnings("unchecked") - public static Set<DistributedMember> getAllNormalMembers(InternalCache cache) { - return new HashSet<DistributedMember>(cache.getInternalDistributedSystem() - .getDistributionManager().getNormalDistributionManagerIds()); + return instance; } /** - * Returns a set of all the members of the distributed system including locators. + * Resolves file system path relative to Gfsh. If the pathname is not specified, then pathname is + * returned. * - * @param cache + * @param pathname a String value specifying the file system pathname to resolve. + * @return a String specifying a path relative to Gfsh. */ - @SuppressWarnings("unchecked") - public static Set<DistributedMember> getAllMembers(InternalCache cache) { - return getAllMembers(cache.getInternalDistributedSystem()); + public static String resolvePathname(final String pathname) { + return (StringUtils.isBlank(pathname) ? pathname + : IOUtils.tryGetCanonicalPathElseGetAbsolutePath(new File(pathname))); } - @SuppressWarnings("unchecked") - public static Set<DistributedMember> getAllMembers(InternalDistributedSystem internalDS) { - return new HashSet<DistributedMember>( - internalDS.getDistributionManager().getDistributionManagerIds()); + public static Result getFunctionResult(ResultCollector<?, ?> rc, String commandName) { + Result result; + List<Object> results = (List<Object>) rc.getResult(); + if (results != null) { + Object resultObj = results.get(0); + if (resultObj instanceof String) { + result = ResultBuilder.createInfoResult((String) resultObj); + } else if (resultObj instanceof Exception) { + result = ResultBuilder.createGemFireErrorResult(((Exception) resultObj).getMessage()); + } else { + result = ResultBuilder.createGemFireErrorResult( + CliStrings.format(CliStrings.COMMAND_FAILURE_MESSAGE, commandName)); + } + } else { + result = ResultBuilder.createGemFireErrorResult( + CliStrings.format(CliStrings.COMMAND_FAILURE_MESSAGE, commandName)); + } + return result; } /*** @@ -553,113 +536,8 @@ public class CliUtil { return execution.execute(function); } - /** - * Returns a Set of DistributedMember for members that have the specified <code>region</code>. - * <code>returnAll</code> indicates whether to return all members or only the first member we - * find. - * - * @param region region path for which members that have this region are required - * @param cache cache instance to use to find members - * @param returnAll if true, returns all matching members, else returns only first one found. - * @return a Set of DistributedMember for members that have the specified <code>region</code>. - */ - public static Set<DistributedMember> getRegionAssociatedMembers(String region, - final InternalCache cache, boolean returnAll) { - if (region == null || region.isEmpty()) { - return Collections.emptySet(); - } - - if (!region.startsWith(Region.SEPARATOR)) { - region = Region.SEPARATOR + region; - } - - DistributedRegionMXBean regionMXBean = - ManagementService.getManagementService(cache).getDistributedRegionMXBean(region); - - if (regionMXBean == null) { - return Collections.emptySet(); - } - - String[] regionAssociatedMemberNames = regionMXBean.getMembers(); - Set<DistributedMember> matchedMembers = new HashSet<>(); - Set<DistributedMember> allClusterMembers = new HashSet<>(); - allClusterMembers.addAll(cache.getMembers()); - allClusterMembers.add(cache.getDistributedSystem().getDistributedMember()); - - for (DistributedMember member : allClusterMembers) { - for (String regionAssociatedMemberName : regionAssociatedMemberNames) { - String name = MBeanJMXAdapter.getMemberNameOrId(member); - if (name.equals(regionAssociatedMemberName)) { - matchedMembers.add(member); - if (!returnAll) { - return matchedMembers; - } - } - } - } - return matchedMembers; - } - - /** - * this finds the member that hosts all the regions passed in. - * - * @param regions - * @param cache - * @param returnAll if true, returns all matching members, otherwise, returns only one. - */ - public static Set<DistributedMember> getQueryRegionsAssociatedMembers(Set<String> regions, - final InternalCache cache, boolean returnAll) { - Set<DistributedMember> results = regions.stream() - .map(region -> getRegionAssociatedMembers(region, cache, true)).reduce((s1, s2) -> { - s1.retainAll(s2); - return s1; - }).get(); - - if (returnAll || results.size() <= 1) { - return results; - } - // returns a set of only one item - return Collections.singleton(results.iterator().next()); - } - - public static String getMemberNameOrId(DistributedMember distributedMember) { - String nameOrId = null; - if (distributedMember != null) { - nameOrId = distributedMember.getName(); - nameOrId = nameOrId != null && !nameOrId.isEmpty() ? nameOrId : distributedMember.getId(); - } - return nameOrId; - } - - public static <T> String arrayToString(T[] array) { - if (array == null) { - return "null"; - } - return Arrays.stream(array).map(String::valueOf).collect(Collectors.joining(", ")); - } - - public static String decodeWithDefaultCharSet(String urlToDecode) { - try { - return URLDecoder.decode(urlToDecode, Charset.defaultCharset().name()); - } catch (UnsupportedEncodingException e) { - return urlToDecode; - } - } - - /** - * Resolves file system path relative to Gfsh. If the pathname is not specified, then pathname is - * returned. - * - * @param pathname a String value specifying the file system pathname to resolve. - * @return a String specifying a path relative to Gfsh. - */ - public static String resolvePathname(final String pathname) { - return (StringUtils.isBlank(pathname) ? pathname - : IOUtils.tryGetCanonicalPathElseGetAbsolutePath(new File(pathname))); - } - - public static void runLessCommandAsExternalViewer(Result commandResult, boolean isError) { + public static void runLessCommandAsExternalViewer(Result commandResult) { StringBuilder sb = new StringBuilder(); String NEW_LINE = System.getProperty("line.separator"); @@ -688,14 +566,53 @@ public class CliUtil { } } - public static String getClientIdFromCacheClientProxy(CacheClientProxy p) { - if (p == null) { - return null; + + static class CustomFileFilter implements FileFilter { + + + private String extensionWithDot; + + public CustomFileFilter(String extensionWithDot) { + this.extensionWithDot = extensionWithDot; } - StringBuffer buffer = new StringBuffer(); - buffer.append("[").append(p.getProxyID()).append(":port=").append(p.getRemotePort()) - .append(":primary=").append(p.isPrimary()).append("]"); - return buffer.toString(); + + @Override + public boolean accept(File pathname) { + String name = pathname.getName(); + return name.endsWith(extensionWithDot); + } + } + public static class DeflaterInflaterData implements Serializable { + + private static final long serialVersionUID = 1104813333595216795L; + private final int dataLength; + + private final byte[] data; + + public DeflaterInflaterData(int dataLength, byte[] data) { + this.dataLength = dataLength; + this.data = data; + } + + public int getDataLength() { + return dataLength; + } + + public byte[] getData() { + return data; + } + + @Override + public String toString() { + return String.valueOf(dataLength); + } + } + + // Methods that will be removed by the next commit: + + private static InternalCache getInternalCache() { + return (InternalCache) CacheFactory.getAnyInstance(); + } } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandResponseBuilder.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandResponseBuilder.java index e7152a5..aa6c011 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandResponseBuilder.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/CommandResponseBuilder.java @@ -14,6 +14,8 @@ */ package org.apache.geode.management.internal.cli; +import org.apache.commons.lang.exception.ExceptionUtils; + import org.apache.geode.management.cli.CliMetaData; import org.apache.geode.management.internal.cli.json.GfJsonException; import org.apache.geode.management.internal.cli.json.GfJsonObject; @@ -40,7 +42,7 @@ public class CommandResponseBuilder { try { jsonObject = new GfJsonObject(jsonString); } catch (GfJsonException e) { - jsonObject = GfJsonObject.getGfJsonErrorObject(CliUtil.stackTraceAsString(e)); + jsonObject = GfJsonObject.getGfJsonErrorObject(ExceptionUtils.getStackTrace(e)); } return new CommandResponse(jsonObject); } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/Launcher.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/Launcher.java index a22f615..a652255 100755 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/Launcher.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/Launcher.java @@ -27,6 +27,7 @@ import org.springframework.shell.core.ExitShellRequest; import org.apache.geode.internal.ExitCode; import org.apache.geode.internal.GemFireVersion; import org.apache.geode.internal.PureJavaMode; +import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.management.internal.cli.i18n.CliStrings; import org.apache.geode.management.internal.cli.shell.Gfsh; import org.apache.geode.management.internal.cli.shell.GfshConfig; @@ -168,7 +169,7 @@ public class Launcher { if (!commandIsAllowed) { System.err.println( - CliStrings.format(MSG_INVALID_COMMAND_OR_OPTION, CliUtil.arrayToString(args))); + CliStrings.format(MSG_INVALID_COMMAND_OR_OPTION, StringUtils.arrayToString(args))); exitRequest = ExitShellRequest.FATAL_EXIT; } else { if (!gfsh.executeScriptLine(commandLineCommand)) { @@ -189,8 +190,8 @@ public class Launcher { try { parsedOptions = this.commandLineParser.parse(args); } catch (OptionException e) { - System.err - .println(CliStrings.format(MSG_INVALID_COMMAND_OR_OPTION, CliUtil.arrayToString(args))); + System.err.println( + CliStrings.format(MSG_INVALID_COMMAND_OR_OPTION, StringUtils.arrayToString(args))); return ExitShellRequest.FATAL_EXIT.getExitCode(); } boolean launchShell = true; diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java index 34cc6c3..ced3749 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactDiskStoreCommand.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.apache.commons.lang.ArrayUtils; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; @@ -176,7 +177,7 @@ public class CompactDiskStoreCommand implements GfshCommand { for (Map.Entry<String, String[]> entry : entrySet) { String[] value = entry.getValue(); - if (CliUtil.contains(value, diskStoreName)) { + if (diskStoreName != null && ArrayUtils.contains(value, diskStoreName)) { return true; } } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java index ae73440..2fdd8d7 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CompactOfflineDiskStoreCommand.java @@ -28,6 +28,7 @@ import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; import org.apache.geode.GemFireIOException; +import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.management.cli.CliMetaData; import org.apache.geode.management.cli.Result; import org.apache.geode.management.internal.cli.CliUtil; @@ -137,7 +138,7 @@ public class CompactOfflineDiskStoreCommand implements GfshCommand { } String fieldsMessage = (maxOplogSize != -1 ? CliStrings.COMPACT_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize + "," : ""); - fieldsMessage += CliUtil.arrayToString(diskDirs); + fieldsMessage += StringUtils.arrayToString(diskDirs); String errorString = CliStrings.format( CliStrings.COMPACT_OFFLINE_DISK_STORE__MSG__ERROR_WHILE_COMPACTING_DISKSTORE_0_WITH_1_REASON_2, diskStoreName, fieldsMessage); diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java index c24a50e..a20488c 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateRegionCommand.java @@ -23,7 +23,9 @@ import java.util.stream.Collectors; import javax.management.ObjectName; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.exception.ExceptionUtils; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; @@ -494,7 +496,7 @@ public class CreateRegionCommand implements GfshCommand { throw (IllegalArgumentException) object; } else if (object instanceof Throwable) { Throwable th = (Throwable) object; - LogWrapper.getInstance().info(CliUtil.stackTraceAsString((th))); + LogWrapper.getInstance().info(ExceptionUtils.getStackTrace((th))); throw new IllegalArgumentException(CliStrings.format( CliStrings.CREATE_REGION__MSG__COULD_NOT_RETRIEVE_REGION_ATTRS_FOR_PATH_0_REASON_1, regionPath, th.getMessage())); @@ -568,7 +570,7 @@ public class CreateRegionCommand implements GfshCommand { for (Map.Entry<String, String[]> entry : entrySet) { String[] value = entry.getValue(); - if (CliUtil.contains(value, diskStoreName)) { + if (diskStoreName != null && ArrayUtils.contains(value, diskStoreName)) { return true; } } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java index 9aec188..ec5e1ec 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.apache.commons.lang.StringUtils; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; @@ -28,7 +29,6 @@ import org.apache.geode.distributed.DistributedMember; import org.apache.geode.management.cli.CliMetaData; import org.apache.geode.management.cli.ConverterHint; import org.apache.geode.management.cli.Result; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.domain.CacheServerInfo; import org.apache.geode.management.internal.cli.domain.MemberInformation; import org.apache.geode.management.internal.cli.functions.GetMemberInformationFunction; @@ -72,8 +72,7 @@ public class DescribeMemberCommand implements GfshCommand { section.addData("Name", memberInformation.getName()); section.addData("Id", memberInformation.getId()); section.addData("Host", memberInformation.getHost()); - section.addData("Regions", - CliUtil.convertStringSetToString(memberInformation.getHostedRegions(), '\n')); + section.addData("Regions", StringUtils.join(memberInformation.getHostedRegions(), '\n')); section.addData("PID", memberInformation.getProcessId()); section.addData("Groups", memberInformation.getGroups()); section.addData("Used Heap", memberInformation.getHeapUsage() + "M"); diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeRegionCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeRegionCommand.java index d75253a..937a355 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeRegionCommand.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeRegionCommand.java @@ -20,9 +20,9 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Function; import java.util.stream.Collectors; +import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.Logger; import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; @@ -33,7 +33,6 @@ import org.apache.geode.internal.logging.LogService; import org.apache.geode.management.cli.CliMetaData; import org.apache.geode.management.cli.ConverterHint; import org.apache.geode.management.cli.Result; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.domain.FixedPartitionAttributesInfo; import org.apache.geode.management.internal.cli.domain.RegionDescription; import org.apache.geode.management.internal.cli.domain.RegionDescriptionPerMember; @@ -134,7 +133,7 @@ public class DescribeRegionCommand implements GfshCommand { memberType = CliStrings.DESCRIBE_REGION__HOSTING__MEMBER; } regionSection.addData(memberType, - CliUtil.convertStringSetToString(regionDescription.getHostingMembers(), '\n')); + StringUtils.join(regionDescription.getHostingMembers(), '\n')); regionSection.addSeparator('.'); TabularResultData commonNonDefaultAttrTable = regionSection.addSection().addTable(); diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java index 85b86db..bf2b505 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/UpgradeOfflineDiskStoreCommand.java @@ -28,6 +28,7 @@ import org.springframework.shell.core.annotation.CliCommand; import org.springframework.shell.core.annotation.CliOption; import org.apache.geode.GemFireIOException; +import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.management.cli.CliMetaData; import org.apache.geode.management.cli.Result; import org.apache.geode.management.internal.cli.CliUtil; @@ -139,7 +140,7 @@ public class UpgradeOfflineDiskStoreCommand implements GfshCommand { } String fieldsMessage = (maxOplogSize != -1 ? CliStrings.UPGRADE_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize + "," : ""); - fieldsMessage += CliUtil.arrayToString(diskDirs); + fieldsMessage += StringUtils.arrayToString(diskDirs); String errorString = CliStrings.format( CliStrings.UPGRADE_OFFLINE_DISK_STORE__MSG__ERROR_WHILE_COMPACTING_DISKSTORE_0_WITH_1_REASON_2, diskStoreName, fieldsMessage); diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/RegionAttributesInfo.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/RegionAttributesInfo.java index 42738eb..afc86e9 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/RegionAttributesInfo.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/RegionAttributesInfo.java @@ -37,7 +37,6 @@ import org.apache.geode.cache.RegionAttributes; import org.apache.geode.cache.Scope; import org.apache.geode.compression.Compressor; import org.apache.geode.internal.cache.AbstractRegion; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.util.RegionAttributesDefault; import org.apache.geode.management.internal.cli.util.RegionAttributesNames; @@ -489,7 +488,7 @@ public class RegionAttributesInfo implements Serializable { if (cacheListenerClassNames != null && !cacheListenerClassNames.isEmpty()) { nonDefaultAttributes.put(RegionAttributesNames.CACHE_LISTENERS, - CliUtil.convertStringListToString(cacheListenerClassNames, ',')); + StringUtils.join(cacheListenerClassNames, ",")); } if (cacheLoaderClassName != null && !cacheLoaderClassName.isEmpty()) { diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/AlterRuntimeConfigFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/AlterRuntimeConfigFunction.java index 74ea983..3ef6eab 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/AlterRuntimeConfigFunction.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/AlterRuntimeConfigFunction.java @@ -18,6 +18,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.logging.log4j.Logger; import org.apache.geode.cache.CacheClosedException; @@ -27,7 +28,6 @@ import org.apache.geode.internal.ConfigSource; import org.apache.geode.internal.cache.InternalCache; import org.apache.geode.internal.cache.execute.InternalFunction; import org.apache.geode.internal.logging.LogService; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.i18n.CliStrings; public class AlterRuntimeConfigFunction implements InternalFunction { @@ -79,7 +79,7 @@ public class AlterRuntimeConfigFunction implements InternalFunction { } catch (Exception e) { logger.error("Exception happened on : " + memberId, e); CliFunctionResult cliFuncResult = - new CliFunctionResult(memberId, e, CliUtil.stackTraceAsString(e)); + new CliFunctionResult(memberId, e, ExceptionUtils.getStackTrace(e)); context.getResultSender().lastResult(cliFuncResult); } } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GarbageCollectionFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GarbageCollectionFunction.java index fc00710..f9d6da4 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GarbageCollectionFunction.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GarbageCollectionFunction.java @@ -17,11 +17,12 @@ package org.apache.geode.management.internal.cli.functions; import java.util.HashMap; import java.util.Map; +import org.apache.commons.lang.exception.ExceptionUtils; + import org.apache.geode.cache.Cache; import org.apache.geode.cache.execute.FunctionContext; import org.apache.geode.distributed.DistributedMember; import org.apache.geode.internal.cache.execute.InternalFunction; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.util.BytesToString; /** @@ -59,7 +60,7 @@ public class GarbageCollectionFunction implements InternalFunction { resultMap.put("HeapSizeAfterGC", bytesToString.of(totalMemoryAfterGC - freeMemoryAfterGC)); resultMap.put("TimeSpentInGC", String.valueOf(timeAfterGC - timeBeforeGC)); } catch (Exception ex) { - String message = "Exception in GC:" + ex.getMessage() + CliUtil.stackTraceAsString(ex); + String message = "Exception in GC:" + ex.getMessage() + ExceptionUtils.getStackTrace(ex); context.getResultSender().lastResult(message); } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunction.java index 2e686fe..55b3d89 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunction.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionAlterFunction.java @@ -16,6 +16,7 @@ package org.apache.geode.management.internal.cli.functions; import java.util.Set; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.logging.log4j.Logger; import org.apache.geode.SystemFailure; @@ -88,7 +89,7 @@ public class RegionAlterFunction implements InternalFunction { String exceptionMsg = th.getMessage(); if (exceptionMsg == null) { - exceptionMsg = CliUtil.stackTraceAsString(th); + exceptionMsg = ExceptionUtils.getStackTrace(th); } resultSender.lastResult(new CliFunctionResult(memberNameOrId, false, exceptionMsg)); } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java index 9fba15c..1b42caa 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.logging.log4j.Logger; import org.apache.geode.cache.Cache; @@ -117,7 +118,7 @@ public class RegionCreateFunction implements InternalFunction { } catch (Exception e) { String exceptionMsg = e.getMessage(); if (exceptionMsg == null) { - exceptionMsg = CliUtil.stackTraceAsString(e); + exceptionMsg = ExceptionUtils.getStackTrace(e); } resultSender.lastResult(handleException(memberNameOrId, exceptionMsg, e)); } diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java index 0fe7049..cd3e4ed 100755 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/shell/Gfsh.java @@ -681,7 +681,7 @@ public class Gfsh extends JLineShell { if (useExternalViewer(commandResult)) { // - Save file and pass to less so that viewer can scroll through // results - CliUtil.runLessCommandAsExternalViewer(commandResult, isError); + CliUtil.runLessCommandAsExternalViewer(commandResult); } else { if (!isScriptRunning) { // Normal Command diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java index 0b0c12b..b48d599 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreCompacter.java @@ -20,10 +20,13 @@ import java.io.StringReader; import java.util.Properties; import java.util.regex.Pattern; +import org.apache.commons.lang.exception.ExceptionUtils; + import org.apache.geode.GemFireIOException; import org.apache.geode.cache.DiskAccessException; import org.apache.geode.internal.cache.DiskStoreImpl; import org.apache.geode.internal.i18n.LocalizedStrings; +import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.GfshParser; import org.apache.geode.management.internal.cli.i18n.CliStrings; @@ -76,7 +79,7 @@ public class DiskStoreCompacter { message)) { errorString = CliStrings.format( CliStrings.COMPACT_OFFLINE_DISK_STORE__MSG__VERIFY_WHETHER_DISKSTORE_EXISTS_IN_0, - CliUtil.arrayToString(diskDirs)); + StringUtils.arrayToString(diskDirs)); } else { errorString = message; } @@ -95,15 +98,15 @@ public class DiskStoreCompacter { if (!isKnownCause) { errorString = CliStrings.format( CliStrings.COMPACT_OFFLINE_DISK_STORE__MSG__CANNOT_ACCESS_DISKSTORE_0_FROM_1_CHECK_GFSH_LOGS, - new Object[] {diskStoreName, CliUtil.arrayToString(diskDirs)}); + new Object[] {diskStoreName, StringUtils.arrayToString(diskDirs)}); } } else { errorString = e.getMessage(); // which are other known exceptions? } - stackTraceString = CliUtil.stackTraceAsString(e); + stackTraceString = ExceptionUtils.getStackTrace(e); } catch (IllegalArgumentException e) { errorString = e.getMessage(); - stackTraceString = CliUtil.stackTraceAsString(e); + stackTraceString = ExceptionUtils.getStackTrace(e); } finally { if (errorString != null) { System.err.println(errorString); @@ -128,7 +131,7 @@ public class DiskStoreCompacter { } catch (Exception ex) { String fieldsMessage = (maxOplogSize != -1 ? CliStrings.COMPACT_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize + "," : ""); - fieldsMessage += CliUtil.arrayToString(dirs); + fieldsMessage += StringUtils.arrayToString(dirs); throw new GemFireIOException(CliStrings.format( CliStrings.COMPACT_OFFLINE_DISK_STORE__MSG__ERROR_WHILE_COMPACTING_DISKSTORE_0_WITH_1_REASON_2, new Object[] {diskStoreName, fieldsMessage, ex.getMessage()}), ex); diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java index f5c803e..e628548 100644 --- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java +++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/util/DiskStoreUpgrader.java @@ -20,10 +20,13 @@ import java.io.StringReader; import java.util.Properties; import java.util.regex.Pattern; +import org.apache.commons.lang.exception.ExceptionUtils; + import org.apache.geode.GemFireIOException; import org.apache.geode.cache.DiskAccessException; import org.apache.geode.internal.cache.DiskStoreImpl; import org.apache.geode.internal.i18n.LocalizedStrings; +import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.GfshParser; import org.apache.geode.management.internal.cli.i18n.CliStrings; @@ -73,7 +76,7 @@ public class DiskStoreUpgrader { message)) { errorString = CliStrings.format( CliStrings.UPGRADE_OFFLINE_DISK_STORE__MSG__CANNOT_LOCATE_0_DISKSTORE_IN_1, - diskStoreName, CliUtil.arrayToString(diskDirs)); + diskStoreName, StringUtils.arrayToString(diskDirs)); } else { errorString = message; } @@ -92,15 +95,15 @@ public class DiskStoreUpgrader { if (!isKnownCause) { errorString = CliStrings.format( CliStrings.UPGRADE_OFFLINE_DISK_STORE__MSG__CANNOT_ACCESS_DISKSTORE_0_FROM_1_CHECK_GFSH_LOGS, - new Object[] {diskStoreName, CliUtil.arrayToString(diskDirs)}); + new Object[] {diskStoreName, StringUtils.arrayToString(diskDirs)}); } } else { errorString = e.getMessage(); // which are other known exceptions? } - stackTraceString = CliUtil.stackTraceAsString(e); + stackTraceString = ExceptionUtils.getStackTrace(e); } catch (IllegalArgumentException e) { errorString = e.getMessage(); - stackTraceString = CliUtil.stackTraceAsString(e); + stackTraceString = ExceptionUtils.getStackTrace(e); } finally { if (errorString != null) { System.err.println(errorString); @@ -125,7 +128,7 @@ public class DiskStoreUpgrader { } catch (Exception ex) { String fieldsMessage = (maxOplogSize != -1 ? CliStrings.UPGRADE_OFFLINE_DISK_STORE__MAXOPLOGSIZE + "=" + maxOplogSize + "," : ""); - fieldsMessage += CliUtil.arrayToString(dirs); + fieldsMessage += StringUtils.arrayToString(dirs); throw new GemFireIOException(CliStrings.format( CliStrings.UPGRADE_OFFLINE_DISK_STORE__MSG__ERROR_WHILE_COMPACTING_DISKSTORE_0_WITH_1_REASON_2, new Object[] {diskStoreName, fieldsMessage, ex.getMessage()}), ex); diff --git a/geode-core/src/test/java/org/apache/geode/internal/lang/StringUtilsJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/lang/StringUtilsJUnitTest.java index f324d10..dedd85b 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/lang/StringUtilsJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/lang/StringUtilsJUnitTest.java @@ -14,6 +14,7 @@ */ package org.apache.geode.internal.lang; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; @@ -45,6 +46,16 @@ import org.apache.geode.test.junit.categories.UnitTest; public class StringUtilsJUnitTest { + @Test + public void arrayToString() { + assertThat(StringUtils.arrayToString(null)).isEqualTo("null"); + String[] array1 = {"one", "two", "three"}; + assertThat(StringUtils.arrayToString(array1)).isEqualTo("one, two, three"); + String[] array2 = {"one", null, "three"}; + assertThat(StringUtils.arrayToString(array2)).isEqualTo("one, null, three"); + String[] array3 = {null}; + assertThat(StringUtils.arrayToString(array3)).isEqualTo("null"); + } @Test public void testGetDigitsOnly() { diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/CliUtilTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/CliUtilTest.java index d181054..44c5fe1 100644 --- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/CliUtilTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/CliUtilTest.java @@ -38,17 +38,6 @@ public class CliUtilTest { public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Test - public void arrayToString() throws Exception { - assertThat(CliUtil.arrayToString(null)).isEqualTo("null"); - String[] array1 = {"one", "two", "three"}; - assertThat(CliUtil.arrayToString(array1)).isEqualTo("one, two, three"); - String[] array2 = {"one", null, "three"}; - assertThat(CliUtil.arrayToString(array2)).isEqualTo("one, null, three"); - String[] array3 = {null}; - assertThat(CliUtil.arrayToString(array3)).isEqualTo("null"); - } - - @Test public void filesToBytesAndThenBytesToFiles() throws IOException { File file1 = new File(temporaryFolder.getRoot(), "file1.txt"); File file2 = new File(temporaryFolder.getRoot(), "file2.txt"); diff --git a/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ClientCommandsTestUtils.java b/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ClientCommandsTestUtils.java index 5ab63e8..038e1c0 100644 --- a/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ClientCommandsTestUtils.java +++ b/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ClientCommandsTestUtils.java @@ -25,6 +25,8 @@ import static org.junit.Assert.assertTrue; import java.util.List; import java.util.Properties; +import org.apache.commons.lang.exception.ExceptionUtils; + import org.apache.geode.cache.Cache; import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.client.ClientCacheFactory; @@ -33,7 +35,6 @@ import org.apache.geode.cache.query.QueryService; import org.apache.geode.cache.server.CacheServer; import org.apache.geode.distributed.DistributedMember; import org.apache.geode.internal.cache.GemFireCacheImpl; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.i18n.CliStrings; import org.apache.geode.management.internal.cli.result.CommandResult; import org.apache.geode.management.internal.cli.result.CompositeResultData; @@ -90,7 +91,7 @@ class ClientCommandsTestUtils extends CliCommandTestBase { cache.getLogger() .info("setupCqs on vm created cqs = " + cache.getQueryService().getCqs().length); } catch (Exception e) { - cache.getLogger().info("setupCqs on vm Exception " + CliUtil.stackTraceAsString(e)); + cache.getLogger().info("setupCqs on vm Exception " + ExceptionUtils.getStackTrace(e)); } return true; }); diff --git a/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeClientCommandDUnitTest.java b/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeClientCommandDUnitTest.java index 37170b1..e36e96f 100644 --- a/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeClientCommandDUnitTest.java +++ b/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/DescribeClientCommandDUnitTest.java @@ -35,6 +35,7 @@ import java.util.concurrent.TimeUnit; import javax.management.ObjectName; +import org.apache.commons.lang.exception.ExceptionUtils; import org.awaitility.Awaitility; import org.junit.Ignore; import org.junit.Test; @@ -62,7 +63,6 @@ import org.apache.geode.management.ClientHealthStatus; import org.apache.geode.management.ManagementService; import org.apache.geode.management.cli.Result; import org.apache.geode.management.internal.SystemManagementService; -import org.apache.geode.management.internal.cli.CliUtil; import org.apache.geode.management.internal.cli.LogWrapper; import org.apache.geode.management.internal.cli.i18n.CliStrings; import org.apache.geode.management.internal.cli.result.CommandResult; @@ -462,7 +462,7 @@ public class DescribeClientCommandDUnitTest extends CliCommandTestBase { } } catch (Exception e) { LogWrapper.getInstance().warning("waitForMixedClients Exception in waitForMBean ::: " - + CliUtil.stackTraceAsString(e)); + + ExceptionUtils.getStackTrace(e)); } return false; })); @@ -573,7 +573,7 @@ public class DescribeClientCommandDUnitTest extends CliCommandTestBase { assertNotNull(p); } catch (Exception eee) { System.err.println("Exception in creating pool " + poolName + " Exception ==" - + CliUtil.stackTraceAsString(eee)); + + ExceptionUtils.getStackTrace(eee)); } } }); @@ -613,7 +613,7 @@ public class DescribeClientCommandDUnitTest extends CliCommandTestBase { } catch (Exception e) { LogWrapper.getInstance() .warning("waitForListClientMBean3 Exception in waitForListClientMbean ::: " - + CliUtil.stackTraceAsString(e)); + + ExceptionUtils.getStackTrace(e)); } return false; } @@ -653,7 +653,7 @@ public class DescribeClientCommandDUnitTest extends CliCommandTestBase { return false; } catch (Exception e) { LogWrapper.getInstance().warning( - "waitForMBean Exception in waitForMBean ::: " + CliUtil.stackTraceAsString(e)); + "waitForMBean Exception in waitForMBean ::: " + ExceptionUtils.getStackTrace(e)); } return false; } @@ -701,7 +701,7 @@ public class DescribeClientCommandDUnitTest extends CliCommandTestBase { assertNotNull(p); } catch (Exception eee) { cache.getLogger().info("Exception in creating pool " + poolName + " Exception ==" - + CliUtil.stackTraceAsString(eee)); + + ExceptionUtils.getStackTrace(eee)); } } }); @@ -756,7 +756,7 @@ public class DescribeClientCommandDUnitTest extends CliCommandTestBase { } catch (Exception e) { LogWrapper.getInstance() .warning("waitForNonSubScribedClientMBean Exception in waitForMBean ::: " - + CliUtil.stackTraceAsString(e)); + + ExceptionUtils.getStackTrace(e)); } return false; })); diff --git a/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ListClientCommandDUnitTest.java b/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ListClientCommandDUnitTest.java index 81e318e..4d84f1e 100644 --- a/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ListClientCommandDUnitTest.java +++ b/geode-cq/src/test/java/org/apache/geode/management/internal/cli/commands/ListClientCommandDUnitTest.java @@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit; import javax.management.ObjectName; +import org.apache.commons.lang.exception.ExceptionUtils; import org.awaitility.Awaitility; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -299,7 +300,7 @@ public class ListClientCommandDUnitTest extends CliCommandTestBase { } catch (Exception e) { LogWrapper.getInstance() .warning("waitForListClientMbean3 Exception in waitForListClientMbean ::: " - + CliUtil.stackTraceAsString(e)); + + ExceptionUtils.getStackTrace(e)); } return false; } @@ -351,7 +352,7 @@ public class ListClientCommandDUnitTest extends CliCommandTestBase { assertNotNull(p); } catch (Exception eee) { System.err.println("Exception in creating pool " + poolName + " Exception ==" - + CliUtil.stackTraceAsString(eee)); + + ExceptionUtils.getStackTrace(eee)); } } }); @@ -384,7 +385,7 @@ public class ListClientCommandDUnitTest extends CliCommandTestBase { } catch (Exception e) { LogWrapper.getInstance() .warning("waitForListClientMbean Exception in waitForListClientMbean ::: " - + CliUtil.stackTraceAsString(e)); + + ExceptionUtils.getStackTrace(e)); } return false; } -- To stop receiving notification emails like this one, please contact prhomb...@apache.org.