http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/GfshVersion.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/GfshVersion.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/GfshVersion.java deleted file mode 100644 index 9215598..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/GfshVersion.java +++ /dev/null @@ -1,455 +0,0 @@ -/* - * ========================================================================= - * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * more patents listed at http://www.pivotal.io/patents. - * ======================================================================== - */ -package com.gemstone.gemfire.internal.tools.gfsh.app; - -import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.net.InetAddress; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import com.gemstone.gemfire.SystemFailure; -import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.CacheClosedException; -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.internal.ClassPathLoader; -import com.gemstone.gemfire.internal.GemFireVersion; -import com.gemstone.gemfire.internal.SocketCreator; -import com.gemstone.gemfire.internal.i18n.LocalizedStrings; - -/** - * This class provides build and version information about gfsh. - * It gathers this information from the resource property file - * for this class. - * - * @author abhishek - */ -/* This class has most of the code 'copied' from GemFireVersion.java. - * The differences are: - * 1. RESOURCE_NAME is "GfshVersion.properties"; - * 2. Uses same error strings as GemFireVersion - only resource name/path differs - * 3. Methods asString & print accept different argument and have slightly - * different behaviour. - */ -public class GfshVersion { - protected static String RESOURCE_NAME = "GfshVersion.properties"; - - private static final Pattern MAJOR_MINOR = Pattern.compile("(\\d+)\\.(\\d*)(.*)"); - - /** The singleton instance */ - private static GfshVersion instance; - - /** Constant for the GemFire version Resource Property entry */ - private static final String PRODUCT_NAME = "Product-Name"; - - /** Constant for the GemFire version Resource Property entry */ - private static final String PRODUCT_VERSION = "Product-Version"; - - /** Constant for the source code date Resource Property entry */ - private static final String SOURCE_DATE = "Source-Date"; - - /** Constant for the source code revision Resource Property entry */ - private static final String SOURCE_REVISION = "Source-Revision"; - - /** Constant for the source code repository Resource Property entry */ - private static final String SOURCE_REPOSITORY = "Source-Repository"; - - /** Constant for the build date Resource Property entry */ - private static final String BUILD_DATE = "Build-Date"; - - /** Constant for the build id Resource Property entry */ - private static final String BUILD_ID = "Build-Id"; - - /** Constant for the build Java version Resource Property entry */ - private static final String BUILD_PLATFORM = "Build-Platform"; - - /** Constant for the build Java version Resource Property entry */ - private static final String BUILD_JAVA_VERSION = "Build-Java-Version"; - - //////////////////// Instance Fields //////////////////// - - /** Error message to display instead of the version information */ - private String error = null; - - /** The name of this product */ - private String productName; - - /** This product's version */ - private String gfshVersion; - - /** The date that the source code for GemFire was last updated */ - private String sourceDate; - - /** The revision of the source code used to build GemFire */ - private String sourceRevision; - - /** The repository in which the source code for GemFire resides */ - private String sourceRepository; - - /** The date on which GemFire was built */ - private String buildDate; - - /** The ID of the GemFire build */ - private String buildId; - - /** The platform on which GemFire was built */ - private String buildPlatform; - - /** The version of Java that was used to build GemFire */ - private String buildJavaVersion; - - /* Just to log gfsh jar version in GemFire Server logs */ - static { - try { - Cache cache = CacheFactory.getAnyInstance(); - if (cache != null && cache.isServer() && cache.getLogger() != null) { - cache.getLogger().config("gfsh version: " + getJavaCodeVersion()); - } - } catch (CacheClosedException e) { - // Ignore, this is just to get handle on log writer. - } - } - - //////////////////// Constructor //////////////////// - - /** - * Private constructor that read the resource properties - * and extracts interesting pieces of information from it - */ - private GfshVersion() { - String gfeVersionPath = GemFireVersion.class.getPackage().getName().replace('.', '/'); - String gfshVersionPath = GfshVersion.class.getPackage().getName().replace('.', '/'); - gfshVersionPath = gfshVersionPath + "/" + RESOURCE_NAME; - - String xtraGfshVersionPath = gfshVersionPath.substring(gfeVersionPath.length() + 1); - - InputStream is = ClassPathLoader.getLatest().getResourceAsStream(getClass(), gfshVersionPath); - if (is == null) { - error = LocalizedStrings.GemFireVersion_COULD_NOT_FIND_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_0.toLocalizedString(xtraGfshVersionPath); - return; - } - - Properties props = new Properties(); - try { - props.load(is); - } catch (Exception ex) { - error = LocalizedStrings.GemFireVersion_COULD_NOT_READ_PROPERTIES_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_0_BECAUSE_1.toLocalizedString(new Object[] {xtraGfshVersionPath, ex}); - return; - } - - this.productName = props.getProperty(PRODUCT_NAME); - if (this.productName == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {PRODUCT_NAME, xtraGfshVersionPath}); - return; - } - this.gfshVersion = props.getProperty(PRODUCT_VERSION); - if (this.gfshVersion == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {PRODUCT_VERSION, xtraGfshVersionPath}); - return; - } - this.sourceDate = props.getProperty(SOURCE_DATE); - if (this.sourceDate == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {SOURCE_DATE, xtraGfshVersionPath}); - return; - } - this.sourceRevision = props.getProperty(SOURCE_REVISION); - if (this.sourceRevision == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {SOURCE_REVISION, xtraGfshVersionPath}); - return; - } - this.sourceRepository = props.getProperty(SOURCE_REPOSITORY); - if (this.sourceRepository == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {SOURCE_REPOSITORY, xtraGfshVersionPath}); - return; - } - this.buildDate = props.getProperty(BUILD_DATE); - if (this.buildDate == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {BUILD_DATE, xtraGfshVersionPath}); - return; - } - this.buildId = props.getProperty(BUILD_ID); - if (this.buildId == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {BUILD_ID, xtraGfshVersionPath}); - return; - } - this.buildPlatform = props.getProperty(BUILD_PLATFORM); - if (this.buildPlatform == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {BUILD_PLATFORM, xtraGfshVersionPath}); - return; - } - this.buildJavaVersion = props.getProperty(BUILD_JAVA_VERSION); - if (this.buildJavaVersion == null) { - error = LocalizedStrings.GemFireVersion_MISSING_PROPERTY_0_FROM_RESOURCE_COM_GEMSTONE_GEMFIRE_INTERNAL_1.toLocalizedString(new Object[] {BUILD_JAVA_VERSION, xtraGfshVersionPath}); - return; - } - } - - //////////////////// Static Methods //////////////////// - - /** - * Returns (or creates) the singleton instance of this class - */ - private static GfshVersion getInstance() { - if (instance == null) { - instance = new GfshVersion(); - } - - return instance; - } - - /** - * Returns the name of this product - */ - public static String getProductName() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.productName; - } - } - - /** - * Returns the version of GemFire being used - */ - public static String getGfshVersion() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.gfshVersion; - } - } - - public static String getJavaCodeVersion() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - StringBuilder result = new StringBuilder(80); - result.append(GfshVersion.getGfshVersion()) - .append(' ') - .append(GfshVersion.getBuildId()) - .append(' ') - .append(GfshVersion.getBuildDate()) - .append(" javac ") - .append(GfshVersion.getBuildJavaVersion()); - return result.toString(); - } - } - - /** - * Returns the date of the source code from which GemFire was built - */ - public static String getSourceDate() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.sourceDate; - } - } - - /** - * Returns the revision of the source code on which GemFire was - * built. - * - */ - public static String getSourceRevision() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.sourceRevision; - } - } - - /** - * Returns the source code repository from which GemFire was built. - * - */ - public static String getSourceRepository() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.sourceRepository; - } - } - - /** - * Returns the date on which GemFire was built - */ - public static String getBuildDate() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.buildDate; - } - } - - /** - * Returns the id of the GemFire build - */ - public static String getBuildId() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.buildId; - } - } - - /** - * Returns the platform on which GemFire was built - */ - public static String getBuildPlatform() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.buildPlatform; - } - } - - /** - * Returns the version of Java used to build GemFire - */ - public static String getBuildJavaVersion() { - GfshVersion v = getInstance(); - if (v.error != null) { - return v.error; - - } else { - return v.buildJavaVersion; - } - } - - /** - * Encodes all available version information into a string and then - * returns that string. - * - * @param printSourceInfo - * Should information about the source code be printed? - */ - public static String asString(boolean printSourceInfo) { - StringWriter sw = new StringWriter(256); - PrintWriter pw = new PrintWriter(sw); - print(pw, printSourceInfo); - pw.flush(); - return sw.toString(); - } - - /** - * Prints all available version information to the given - * <code>PrintWriter</code> in a standard format. - * - * @param pw - * writer to write version info to - * @param printSourceInfo - * Should information about the source code be printed? - */ - protected static void print(PrintWriter pw, boolean printSourceInfo) { - String jarVersion = GfshVersion.getJavaCodeVersion().trim(); - pw.println(getProductName() + " version: " + jarVersion); - - /* - * TODO: GemFireVersion here compares the version info read by - * GemFireVersion and available in product/lib directory. The 'version - * CREATE' option to create the gfsh version file is not added currently. As - * gfsh releases could be different than GemFire release, could we still use - * product/lib? - */ - - if (printSourceInfo) { - String sourceRevision = GfshVersion.getSourceRevision(); - pw.println("Source revision: " + sourceRevision); - - String sourceRepository = GfshVersion.getSourceRepository(); - pw.println("Source repository: " + sourceRepository); - } - - InetAddress host = null; - try { - host = SocketCreator.getLocalHost(); - } catch (VirtualMachineError err) { - SystemFailure.initiateFailure(err); - // If this ever returns, rethrow the error. We're poisoned - // now, so don't let this thread continue. - throw err; - } catch (Throwable t) { - // Whenever you catch Error or Throwable, you must also - // catch VirtualMachineError (see above). However, there is - // _still_ a possibility that you are dealing with a cascading - // error condition, so you also need to check to see if the JVM - // is still usable: - SystemFailure.checkFailure(); - } - - int cpuCount = Runtime.getRuntime().availableProcessors(); - pw.println(LocalizedStrings.GemFireVersion_RUNNING_ON_0 - .toLocalizedString(host + ", " + cpuCount + " cpu(s)" + ", " - + System.getProperty("os.arch") + " " - + System.getProperty("os.name") + " " - + System.getProperty("os.version"))); - - pw.flush(); - } - - public static int getMajorVersion(String v) { - int majorVersion = 0; - Matcher m = MAJOR_MINOR.matcher(v); - if (m.matches()) { - String digits = m.group(1); - if (digits != null && digits.length() > 0) { - majorVersion = Integer.decode(digits).intValue(); - } - } - return majorVersion; - } - - public static int getMinorVersion(String v) { - int minorVersion = 0; - Matcher m = MAJOR_MINOR.matcher(v); - if (m.matches()) { - String digits = m.group(2); - if (digits != null && digits.length() > 0) { - minorVersion = Integer.decode(digits).intValue(); - } - } - return minorVersion; - } - - /////////////////////// Main Program //////////////////// - - /** - * Populates the gemfireVersion.properties file - */ - public final static void main(String args[]) { -// System.out.println("-------------------------------------------------"); -// -// System.out.println(asString(false)); -// -// System.out.println("-------------------------------------------------"); -// - System.out.println(asString(true)); - } -}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/Nextable.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/Nextable.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/Nextable.java deleted file mode 100644 index 54b9c22..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/Nextable.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app; - -import java.util.List; - -public interface Nextable -{ - List next(Object arg) throws Exception; -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/ServerExecutable.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/ServerExecutable.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/ServerExecutable.java deleted file mode 100644 index 9ad2f6a..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/ServerExecutable.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app; - -public interface ServerExecutable -{ - Object execute(String command, String regionPath, Object arg) throws Exception; - - byte getCode(); - - String getCodeMessage(); - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregateFunctionTask.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregateFunctionTask.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregateFunctionTask.java deleted file mode 100644 index 7b3eb4f..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregateFunctionTask.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.aggregator; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; - -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateFunction; -import com.gemstone.gemfire.internal.tools.gfsh.command.AbstractCommandTask; -import com.gemstone.gemfire.internal.tools.gfsh.command.CommandResults; - -/** - * AggregateFunctionTask is used by Aggregator. - * - * @author dpark - */ -public class AggregateFunctionTask extends AbstractCommandTask -{ - private static final long serialVersionUID = 1L; - - private String regionFullPath; - private AggregateFunction function; - - // Default constructor required for serialization - public AggregateFunctionTask() - { - } - - public AggregateFunctionTask(AggregateFunction function, String regionFullPath) - { - this.function = function; - this.regionFullPath = regionFullPath; - } - - public CommandResults runTask(Object userData) - { - CommandResults results = new CommandResults(); - try { - AggregatorPeer aggregator = new AggregatorPeer(regionFullPath); - results.setDataObject(aggregator.aggregate(function)); - } catch (Exception ex) { - results.setCode(CommandResults.CODE_ERROR); - results.setException(ex); - } - return results; - } - - public void fromData(DataInput input) throws IOException, ClassNotFoundException - { - super.fromData(input); - regionFullPath = DataSerializer.readString(input); - function = (AggregateFunction)DataSerializer.readObject(input); - } - - public void toData(DataOutput output) throws IOException - { - super.toData(output); - DataSerializer.writeString(regionFullPath, output); - DataSerializer.writeObject(function, output); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/Aggregator.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/Aggregator.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/Aggregator.java deleted file mode 100644 index e09d72c..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/Aggregator.java +++ /dev/null @@ -1,549 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.aggregator; - -import java.util.ArrayList; -import java.util.HashMap; - -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateFunction; -import com.gemstone.gemfire.internal.tools.gfsh.app.command.CommandClient; -import com.gemstone.gemfire.internal.tools.gfsh.app.command.CommandException; -import com.gemstone.gemfire.internal.tools.gfsh.command.CommandResults; - - -/** - * Aggregator invokes a specified aggregate function on a specified region. - * Aggregator works only in the client/server topology. As such, it requires endpoints - * that specifies one or more cache servers to connect to. It also requires - * the full path of a command region with which it will communicate with the - * cache server(s) listed in the endpoints. The command region path must be - * unique per distributed system. If there are multiple distributed systems - * that an aggregation needs to be performed on, then the command region - * path must be unique for each distributed system. For example, given DS1 - * and DS2, DS1 can be assigned to "/command1" and DS2 to "/command2". It is - * not permitted to share, however, "/command1" with both distributed systems. - * <p> - * Aggregator internally keeps track of all aggregators created. If an - * aggregator already exists under a given commandRegionFullPath, - * then the endpoints of the existing aggregator will be used for all - * subsequently created aggregators. This also applies to the aggregators created - * by the addAggregator() method. - * <p> - * To remove all aggregators, invoke the static method closeAll(). Use this - * method with a care. All aggregators will be closed, and hence, none of them will - * be valid after this call. - * - * @author dpark - * - */ -public class Aggregator -{ - /** - * The hashmap that contains the global aggregator counts. - */ - private static HashMap allAggregatorsMap = new HashMap(); - - /** - * SingleAggregator owned by this aggregator. - */ - private SingleAggregator thisAggregator; - - /** - * All SingleAggregator objects added by addAggregator() and the constructor. - */ - private SingleAggregator singleAggregators[]; - - /** - * The aggregator map that contains all SingleAggregator objects added by - * addAggregator() and the constructor. it contains - * (commandRegionFullPath, SingleAggregator) pairs. - */ - private HashMap aggregatorMap = new HashMap(3); - - /** - * The aggregate invokation timeout in msec. The default value is 30000 msec (or 30 sec). - */ - private long timeout = 30000; - - /** - * Creates an aggregator with the specified command region path and endpoints. - * The cache servers specified in the endpoints must have also defined - * the specified command region, otherwise, aggregate() will throw an exception. - * - * @param commandRegionFullPath The full path of the command region used to - * communicate with the cache servers listed in - * the endpoints. The cache servers must pre-define - * the command region, otherwise, aggregate() will - * throw an exception. - * @param endpoints The endpoints of cache server(s) that host the command region. - * The endpoints format is "end1=host1:port1,end2=host2:port2". - */ - public Aggregator(String commandRegionFullPath, String endpoints) - { - commandRegionFullPath = getCanonicalRegionPath(commandRegionFullPath); - thisAggregator = new SingleAggregator(commandRegionFullPath, endpoints); - synchronized (aggregatorMap) { - singleAggregators = new SingleAggregator[1]; - singleAggregators[0] = thisAggregator; - aggregatorMap.put(commandRegionFullPath, thisAggregator); - allAggregatorsMap.put(commandRegionFullPath, new AggregatorCount(thisAggregator)); - incrementCount(commandRegionFullPath); - } - } - - /** - * Creates an aggregator with the specified command client. - * The cache servers must have also defined the command region defined, - * otherwise, aggregate() will throw an exception. - * - * @param commandClient The command client to be used for sending aggregate requests - * to the cache servers. - */ - public Aggregator(CommandClient commandClient) - { - thisAggregator = new SingleAggregator(commandClient); - String commandRegionFullPath = commandClient.getOutboxRegionFullPath(); - synchronized (aggregatorMap) { - singleAggregators = new SingleAggregator[1]; - singleAggregators[0] = thisAggregator; - aggregatorMap.put(commandRegionFullPath, thisAggregator); - allAggregatorsMap.put(commandRegionFullPath, new AggregatorCount(thisAggregator)); - incrementCount(commandRegionFullPath); - } - } - - /** - * Increments the reference count of the specified aggregator. - * @param commandRegionFullPath The full path of the command region. - * @return The incremented count. Returns -1 if the specified aggregator - * does not exist. - */ - private static int incrementCount(String commandRegionFullPath) - { - AggregatorCount ac = (AggregatorCount)allAggregatorsMap.get(commandRegionFullPath); - if (ac == null) { - return -1; - } - ac.count++; - return ac.count; - } - - /** - * Decrements the reference count of the specified aggregator. - * If the decremented count is 0, then the aggregator is removed - * from allAggregateorsMap. The caller must close the aggregator - * if the decremented count is 0. - * @param commandRegionFullPath The full path of the command region. - * @return The decremented count. Returns -1 if the specified aggregator - * does not exist. - */ - private static int decrementCount(String commandRegionFullPath) - { - AggregatorCount ac = (AggregatorCount)allAggregatorsMap.get(commandRegionFullPath); - if (ac == null) { - return -1; - } - ac.count--; - if (ac.count <= 0) { - allAggregatorsMap.remove(commandRegionFullPath); - } - - return ac.count; - } - - /** - * Returns the reference count of the specified aggregator. - * @param commandRegionFullPath The full path of the command region. - */ - private static int getCount(String commandRegionFullPath) - { - AggregatorCount ac = (AggregatorCount)allAggregatorsMap.get(commandRegionFullPath); - if (ac == null) { - return 0; - } - - return ac.count; - } - - /** - * Adds an aggregator. If the specified commandRegionFullPath has already been added - * in this aggregator, this call is silently ignored. It is important to note that - * the specified endpoints is honored per unique commandRegionFullPath. That means - * if another aggregator is already created or added with the same commandRegionFullPath, - * then that aggregator is used instead. A new aggregator will be created only if - * there is no aggregator found with the same commandRegionFullPath. In other words, - * the endpoints will not be assigned if there exist another aggregator that has - * the same commandRegionFullPath. It is ignored silently and the exiting aggregator - * is used instead. Note that the exiting aggregator might have been assigned - * to a different endpoints. - * - * @param commandRegionFullPath The full path of the command region used to - * communicate with the cache servers listed in - * the endpoints. The cache servers must pre-define - * the command region, otherwise, aggregate() will - * throw an exception. - * @param endpoints The endpoints of cache server(s) that host the command region. - * The endpoints format is "end1=host1:port1,end2=host2:port2". - * @throws AggregatorException Thrown if there is a cache related error. - */ - public void addAggregator(String commandRegionFullPath, String endpoints) throws AggregatorException - { - if (isClosed()) { - throw new AggregatorException("Aggregator closed. Unable to add the specified aggregator. Please create a new Aggregator first."); - } - - synchronized (aggregatorMap) { - commandRegionFullPath = getCanonicalRegionPath(commandRegionFullPath); - SingleAggregator aggregator = (SingleAggregator)aggregatorMap.get(commandRegionFullPath); - if (aggregator == null) { - aggregator = new SingleAggregator(commandRegionFullPath, endpoints); - aggregatorMap.put(commandRegionFullPath, aggregator); - incrementCount(commandRegionFullPath); - allAggregatorsMap.put(commandRegionFullPath, new AggregatorCount(aggregator)); - singleAggregators = (SingleAggregator[])aggregatorMap.values().toArray(new SingleAggregator[0]); - } - } - } - - /** - * Removes the aggregator identified by the commandRegionFullPath from this aggregator. - * @param commandRegionFullPath The full path of the command region used to - * communicate with the cache servers listed in - * the endpoints. - * @throws AggregatorException Thrown if there is a cache related error or - * this aggregator's commandRegionFullPath is same - * as the specified commandRegionFullPath. To remove - * this aggregator, invoke close() instead. - */ - public void removeAggregator(String commandRegionFullPath) throws AggregatorException - { - commandRegionFullPath = getCanonicalRegionPath(commandRegionFullPath); - if (thisAggregator.getCommandRegionFullPath().equals(commandRegionFullPath)) { - throw new AggregatorException("Removing the primary (this) aggregator is not allowed. Please use close() instead."); - } - - remove(commandRegionFullPath); - } - - /** - * Removes the specified aggregator. It closes the aggregator if the - * reference count is 0. - * - * @param commandRegionFullPath The full path of the command region used to - * communicate with the cache servers listed in - * the endpoints. - * @throws AggregatorException - */ - private void remove(String commandRegionFullPath) throws AggregatorException - { - synchronized (aggregatorMap) { - SingleAggregator aggregator = (SingleAggregator)aggregatorMap.remove(commandRegionFullPath); - if (aggregator != null) { - decrementCount(commandRegionFullPath); - if (getCount(commandRegionFullPath) <= 0) { - aggregator.close(); - } - } - } - } - - /** - * Closes this aggregator and removes all added aggregator. This aggregator - * is empty upon return of this call and no longer valid. The aggregate() - * method will throw an exception if close() has been invoked. - * - * @throws AggregatorException Thrown if there is a cache related error. - */ - public void close() throws AggregatorException - { - synchronized (aggregatorMap) { - - String paths[] = (String[])aggregatorMap.keySet().toArray(new String[0]); - for (int i = 0; i < paths.length; i++) { - remove(paths[i]); - } - aggregatorMap.clear(); - singleAggregators = new SingleAggregator[0]; - thisAggregator = null; - } - } - - /** - * Returns true if this aggregator is closed. If true, then this - * aggregator is no longer valid. All references to this object - * should be set to null so that it can be garbage collected. - * @return whether aggregator is closed - */ - public boolean isClosed() - { - return thisAggregator == null; - } - - /** - * Closes all aggregators. All aggregators will be no longer valid - * after this call. - */ - public static void closeAll() - { - AggregatorCount acs[] = (AggregatorCount[])allAggregatorsMap.keySet().toArray(new AggregatorCount[0]); - for (int i = 0; i < acs.length; i++) { - try { - acs[i].aggregator.close(); - } catch (AggregatorException e) { - // ignore - do not throw an exception - // because one of them failed. continue - // closing all others. - } - } - allAggregatorsMap.clear(); - } - - /** - * Executes the specified function and returns an aggregated result defined - * by the function. - * - * @param function The aggregate function to execute. - * @param regionFullPath The region on which the aggregate function to be - * performed. - * @return Returns the result from the specified function. See the function - * definition for the return type. - * @throws AggregatorException Thrown if there is a cache related error. - */ - public synchronized Object aggregate(AggregateFunction function, String regionFullPath) throws AggregatorException - { - if (isClosed()) { - throw new AggregatorException("Aggregator closed. Unable to aggregate. Please create a new Aggregator."); - } - - SingleAggregator aggregators[] = this.singleAggregators; - - // If only one aggregator then no need to use separate threads. - // Return the result using the current thread. - if (aggregators.length == 1) { - return aggregators[0].aggregate(function, regionFullPath); - } - - // Need to spawn threads to parallelize the aggregate fuction - // execution on different distributed systems. Assign - // a thread per aggregator (or distributed system). - ArrayList resultsList = new ArrayList(); - ArrayList exceptionList = new ArrayList(); - long count = aggregators.length; - for (int i = 0; i < count; i++) { - new Thread(new DSAggregator(function, aggregators[i], regionFullPath, resultsList, exceptionList)).start(); - } - - // Wait and collect results returned by all aggregators. - // resultsList contains results from all distributed systems. - boolean allResponded = false; - long startTime = System.currentTimeMillis(); - do { - try { - wait(timeout); - synchronized (resultsList) { - allResponded = resultsList.size() == count; - if (allResponded == false) { - if (exceptionList.isEmpty() == false) { - break; - } - } - } - if (allResponded == false && System.currentTimeMillis() - startTime >= timeout) { - break; - } - } catch (InterruptedException e) { - // ignore - } - } while (allResponded == false); - - // If all responded then aggregate the results by invoking the - // AggregateFunction.aggregateDistributedSystems(), which is - // responsible for aggregating the results. - if (allResponded == false) { - - // Throw exception if not all responded - if (exceptionList.isEmpty() == false) { - - throw new AggregatorException("Distributed System Error. Errors from " - + exceptionList.size() - + " distributed system(s). See getClientExceptions()", - (Throwable[])exceptionList.toArray(new Throwable[0])); - } else { - throw new AggregatorException("The aggregate operation timed out. Not all distributed systems responded within the timeout period of " + timeout + " msec."); - } - } else { - Object results[] = resultsList.toArray(); - return function.aggregateDistributedSystems(results); - } - } - - /** - * Returns the timeout value in msec. The default value is 30000 msec (or 30 seconds) - */ - public long getTimeout() - { - return timeout; - } - - /** - * Sets the timeout in msec. The default value is 30000 msec (or 30 seconds) - * @param timeout The timeout value in msec. - */ - public void setTimeout(long timeout) - { - this.timeout = timeout; - } - - /** - * Returns the full path of the command region. - */ - public String getCommandRegionFullPath() - { - return thisAggregator.getCommandRegionFullPath(); - } - - /** - * Returns the endpoints. - */ - public String getEndpoints() - { - return thisAggregator.getEndpoints(); - } - - /** - * Returns the canonical region path. - * @param regionPath The region path to convert to a canonical form. - */ - private String getCanonicalRegionPath(String regionPath) - { - // Remove leading and trailing spaces. - regionPath = regionPath.trim(); - - // must begin with '/'. - if (regionPath.startsWith("/") == false) { - regionPath = "/" + regionPath; - } - - return regionPath; - } - - /** - * Notifies the results. - */ - private synchronized void notifyResults() - { - notify(); - } - - /** - * DSAggregator is a Runnable that each aggregate thread uses - * to keep aggregate context information separate from others. - */ - class DSAggregator implements Runnable - { - private AggregateFunction function; - private SingleAggregator aggregator; - private ArrayList resultsList; - private ArrayList exceptionList; - private String regionFullPath; - - DSAggregator(AggregateFunction function, SingleAggregator aggregator, String regionFullPath, ArrayList resultsList, ArrayList exceptionList) - { - this.function = function; - this.aggregator = aggregator; - this.regionFullPath = regionFullPath; - this.resultsList = resultsList; - this.exceptionList = exceptionList; - } - - public void run() - { - try { - Object results = aggregator.aggregate(function, regionFullPath); - synchronized (resultsList) { - resultsList.add(results); - } - notifyResults(); - } catch (AggregatorException ex) { - synchronized (resultsList) { - exceptionList.add(ex); - } - notifyResults(); - } - } - } - - //FindBugs - make static inner class - static class AggregatorCount - { - public int count = 0; - public SingleAggregator aggregator; - - AggregatorCount(SingleAggregator aggregator) - { - this.aggregator = aggregator; - } - } -} - -/** - * SingleAggregator holds CommandClient information of an aggregator. - */ -class SingleAggregator -{ - private CommandClient commandClient; - - SingleAggregator(String commandRegionFullPath, String endpoints) - { - commandClient = new CommandClient(commandRegionFullPath, endpoints); - } - - SingleAggregator(CommandClient commandClient) - { - this.commandClient = commandClient; - } - - /** - * - * @param function - * @param regionFullPath - * @return Returns null of isListenerEnabled() is true. In that case, the - * aggregated results are delivered to the registered AggregatedDataListeners. - * @throws AggregatorException - */ - Object aggregate(AggregateFunction function, String regionFullPath) throws AggregatorException - { - try { - CommandResults results = commandClient.execute(new AggregateFunctionTask(function, regionFullPath)); - if (results.getCode() != CommandResults.CODE_NORMAL) { - throw new AggregatorException(results.getCodeMessage(), results.getException()); - } - return results.getDataObject(); - } catch (Exception ex) { - throw new AggregatorException(ex); - } - } - - String getCommandRegionFullPath() - { - return commandClient.getOutboxRegionFullPath(); - } - - String getEndpoints() - { - return commandClient.getEndpoints(); - } - - public void close() throws AggregatorException - { - try { - commandClient.close(); - } catch (CommandException ex) { - throw new AggregatorException(ex); - } - } - - public boolean isClosed() - { - return commandClient.isClosed(); - } -} - http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorException.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorException.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorException.java deleted file mode 100644 index 0e59aba..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorException.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.aggregator; - -/** - * AggregatorException is thrown by Aggregator if there is - * any error related to the aggregator. - * - * @author dpark - * - */ -public class AggregatorException extends Exception -{ - private static final long serialVersionUID = 1L; - - private Throwable functionExceptions[]; - - public AggregatorException() - { - super(); - } - public AggregatorException(String message) - { - super(message); - } - - public AggregatorException(String message, Throwable cause) - { - super(message, cause); - } - - public AggregatorException(Throwable cause) - { - super(cause); - } - - public AggregatorException(String message, Throwable functionExceptions[]) - { - super(message); - this.functionExceptions = functionExceptions; - } - - /** - * The exception caught in AggregateFunction.run(). - * @return exception caught in AggregateFunction.run() - */ - public Throwable[] getFunctionExceptions() - { - return functionExceptions; - } -} - http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorPeer.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorPeer.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorPeer.java deleted file mode 100644 index 35f15e5..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/AggregatorPeer.java +++ /dev/null @@ -1,254 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.aggregator; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - -import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.execute.Execution; -import com.gemstone.gemfire.cache.execute.FunctionService; -import com.gemstone.gemfire.internal.cache.PartitionedRegion; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateFunction; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregatorPartitionFunction; - -/** - * AggregatorPeer is experimental use only. If the application is a peer member - * hosting the specified region, then this class may provide better performance - * than Aggregator, which uses the client/server topology. It also does not - * require the command region to be created unless the method - * aggregate(AggregateFunction function, Aggregator aggregatorClient) is used. - * In which case, the command region is created by Aggregator. - * - * @author dpark - * - */ -public class AggregatorPeer -{ - PartitionedRegion region; - Execution execution; - - // 30 sec timeout; - private long timeout = 30000; - private Set routingKeySet; - - /** - * Creates a AggregatorPeer object with the specified region path. - * @param regionFullPath The full path of the partitioned region on - * which aggregation operations are to be executed. - */ - public AggregatorPeer(String regionFullPath) - { - Cache cache = CacheFactory.getAnyInstance(); - region = (PartitionedRegion)cache.getRegion(regionFullPath); - init(); - } - - /** - * Creates an AggregatorPeer object with the specified partitioned region. - * @param region The partitioned region on which aggregation operations - * are to be executed. - */ - public AggregatorPeer(Region region) - { - this.region = (PartitionedRegion)region; - init(); - } - - private void init() - { - execution = FunctionService.onMembers(region.getCache().getDistributedSystem()); - int totalNumBuckets = region.getPartitionAttributes().getTotalNumBuckets(); - routingKeySet = new CopyOnWriteArraySet(); - for (int i = 0; i < totalNumBuckets; i++) { - routingKeySet.add(i); - } - } - - public void setRoutingKeys(Set routingKeySet) - { - this.routingKeySet = routingKeySet; - } - - public Set getRoutingKeys() - { - return routingKeySet; - } - - public Region getRegion() - { - return region; - } - - public Object aggregate(AggregateFunction function) throws AggregatorException - { - return aggregate(function, routingKeySet); - } - - /** - * Executes the specified function in each of the partition buckets identified - * by the specified routingKeySet. - * @param function aggregate function to execute. - * @param routingKeySet A set of RoutingKey objects that identify the - * partition buckets in which the function to be executed. - * @return Returns aggregate results. The result type is specified by the function - * passed in. - * @throws AggregatorException - */ - private Object aggregate(AggregateFunction function, Set routingKeySet) throws AggregatorException - { - try { - Object obj = execution.withArgs(function).execute(AggregatorPartitionFunction.ID).getResult(); - if (obj instanceof List) { - List list = (List)obj; - return function.aggregate(list); - } else if (obj instanceof Map) { - // GFE 6.3 support - Map map = (Map)obj; - ArrayList list = new ArrayList(); - Collection<List> col = map.values(); - for (List list2 : col) { - list.addAll(list2); - } - return function.aggregate(list); - } else { - throw new AggregatorException("Unsupported aggregate result type: " + obj.getClass().getName()); - } - } catch (Exception ex) { - throw new AggregatorException(ex); - } - } - - public synchronized Object aggregate(AggregateFunction function, Aggregator aggregatorClient) throws AggregatorException - { - if (aggregatorClient == null) { - return aggregate(function); - } else { - ArrayList resultsList = new ArrayList(); - ArrayList exceptionList = new ArrayList(); - long count = 2; - new Thread(new LocalAggregator(function, resultsList, exceptionList)).start(); - - for (int i = 0; i < count - 1; i++) { - new Thread(new DSAggregator(function, aggregatorClient, resultsList, exceptionList)).start(); - } - boolean allResponded = false; - long startTime = System.currentTimeMillis(); - do { - try { - wait(timeout); - synchronized (resultsList) { - allResponded = resultsList.size() == count; - if (allResponded == false) { - if (exceptionList.isEmpty() == false) { - break; - } - } - } - if (allResponded == false && System.currentTimeMillis() - startTime >= timeout) { - break; - } - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } while (allResponded == false); - - if (allResponded == false) { - if (exceptionList.isEmpty() == false) { - - throw new AggregatorException("Distributed System Error. Errors from " - + exceptionList.size() - + " distributed system(s). See getClientExceptions()", - (Throwable[])exceptionList.toArray(new Throwable[0])); - } else { - throw new AggregatorException("The aggregate operation timedout. Not all distributed systems responded within the timeout period of " + timeout + " msec."); - } - } else { - Object results[] = resultsList.toArray(); - return function.aggregateDistributedSystems(results); - } - } - } - - public long getTimeout() - { - return timeout; - } - - public void setTimeout(long timeout) - { - this.timeout = timeout; - } - - private synchronized void notifyResults() - { - notify(); - } - - class LocalAggregator implements Runnable - { - private AggregateFunction function; - private ArrayList resultsList; - private ArrayList exceptionList; - - LocalAggregator(AggregateFunction function, ArrayList resultsList, ArrayList exceptionList) - { - this.function = function; - this.resultsList = resultsList; - this.exceptionList = exceptionList; - } - - public void run() - { - try { - Object results = aggregate(function); - synchronized (resultsList) { - resultsList.add(results); - } - notifyResults(); - } catch (AggregatorException ex) { - synchronized (resultsList) { - exceptionList.add(ex); - } - notifyResults(); - } - } - } - - class DSAggregator implements Runnable - { - private AggregateFunction function; - private Aggregator aggregatorClient; - private ArrayList resultsList; - private ArrayList exceptionList; - - DSAggregator(AggregateFunction function, Aggregator aggregatorClient, ArrayList resultsList, ArrayList exceptionList) - { - this.function = function; - this.aggregatorClient = aggregatorClient; - this.resultsList = resultsList; - this.exceptionList = exceptionList; - } - - public void run() - { - try { - Object results = aggregatorClient.aggregate(function, region.getFullPath()); - synchronized (resultsList) { - resultsList.add(results); - } - notifyResults(); - } catch (AggregatorException ex) { - synchronized (resultsList) { - exceptionList.add(ex); - } - notifyResults(); - } - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/LocalRegionInfoFunction.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/LocalRegionInfoFunction.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/LocalRegionInfoFunction.java deleted file mode 100644 index 8f1e1db..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/LocalRegionInfoFunction.java +++ /dev/null @@ -1,235 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.aggregator.functions.util; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import com.gemstone.gemfire.DataSerializable; -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.execute.FunctionContext; -import com.gemstone.gemfire.distributed.DistributedMember; -import com.gemstone.gemfire.distributed.DistributedSystem; -import com.gemstone.gemfire.internal.GemFireVersion; -import com.gemstone.gemfire.internal.cache.BucketRegion; -import com.gemstone.gemfire.internal.cache.ForceReattemptException; -import com.gemstone.gemfire.internal.cache.PartitionedRegion; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateFunction; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateResults; -import com.gemstone.gemfire.internal.tools.gfsh.app.cache.data.MapMessage; - -public class LocalRegionInfoFunction implements AggregateFunction, DataSerializable -{ - private static final long serialVersionUID = 1L; - - private String regionPath; - - private static boolean priorTo6011 = true; - - static { - priorTo6011 = isPriorTo6011(); - } - - static boolean isPriorTo6011() - { - String gemfireVersion = GemFireVersion.getGemFireVersion(); - String split[] = gemfireVersion.split("\\."); - int major = 0; - int minor = 0; - int update = 0; - int update2 = 0; - for (int i = 0; i < split.length; i++) { - switch (i) { - case 0: - major = Integer.parseInt(split[i]); - break; - case 1: - try { - minor = Integer.parseInt(split[i]); - } catch (NumberFormatException ex) { - minor = Integer.parseInt(split[i].substring(0, 1)); - } - break; - case 2: - try { - update = Integer.parseInt(split[i]); - } catch (NumberFormatException ex) { - // non-number. ignore - } - break; - case 3: - try { - update2 = Integer.parseInt(split[i]); - } catch (NumberFormatException ex) { - // non-number. ignore. - } - break; - } - } - - if (major < 6) { - return true; // 7 - } else if (minor > 0) { - return false; // 6.1 - } else if (update < 1) { - return true; // 6.0.0 - } else if (update > 1) { - return false; // 6.0.2 - } else if (update2 <= 0) { - return true; // 6.0.1.0 - } else { - return false; // 6.0.1.1 - } - - } - - public LocalRegionInfoFunction() - { - } - - public LocalRegionInfoFunction(String regionPath) - { - this.regionPath = regionPath; - } - - public String getRegionPath() - { - return regionPath; - } - - public void setRegionPath(String regionPath) - { - this.regionPath = regionPath; - } - - public AggregateResults run(FunctionContext context) - { - AggregateResults results = new AggregateResults(); - Cache cache = CacheFactory.getAnyInstance(); - DistributedSystem ds = cache.getDistributedSystem(); - DistributedMember member = ds.getDistributedMember(); - - Region region = cache.getRegion(regionPath); - if (region == null) { - results.setCode(AggregateResults.CODE_ERROR); - results.setCodeMessage("Undefined region: " + regionPath); - return results; - } - - MapMessage message = new MapMessage(); - message.put("MemberId", member.getId()); - message.put("MemberName", ds.getName()); - message.put("Host", member.getHost()); - // message.put("IpAddress", - // dataSet.getNode().getMemberId().getIpAddress().getHostAddress()); - // message.put("Port", parent.getNode().getMemberId().getPort()); - message.put("Pid", member.getProcessId()); - message.put("RegionPath", regionPath); - - boolean isPR = region instanceof PartitionedRegion; - message.put("IsPR", isPR); - if (isPR) { - PartitionedRegion pr = (PartitionedRegion) region; - SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy h:mm:ss.SSS a"); - message.put("LastAccessedTime", format.format(new Date(pr.getLastAccessedTime()))); - message.put("LastModifiedTime", format.format(new Date(pr.getLastModifiedTime()))); - - // total local primary bucket size - int totalRegionSize = 0; - // if (priorTo6011) { // 5.7 - 6.0.1 - // The following call is not returning the primary bucket regions. - // totalRegionSize = PartitionRegionHelper.getLocalData(pr).size(); - - // getDataStore() is null if peer client - if (pr.getDataStore() == null) { - message.put("IsPeerClient", true); - } else { - List<Integer> bucketIdList = pr.getDataStore().getLocalPrimaryBucketsListTestOnly(); - for (Integer bucketId : bucketIdList) { - BucketRegion bucketRegion; - try { - bucketRegion = pr.getDataStore().getInitializedBucketForId(null, bucketId); - totalRegionSize += bucketRegion.size(); - } catch (ForceReattemptException e) { - // ignore - } - } - message.put("IsPeerClient", false); - } - - // } else { - // // The following call is not returning the primary bucket - // regions. - // // totalRegionSize = - // PartitionRegionHelper.getLocalData(pr).size(); - // - // Region localRegion = new LocalDataSet(pr, - // pr.getDataStore().getAllLocalPrimaryBucketIds()); - // totalRegionSize = localRegion.size(); - // } - message.put("RegionSize", totalRegionSize); - - } else { - message.put("IsPeerClient", false); - message.put("RegionSize", region.size()); - message.put("Scope", region.getAttributes().getScope().toString()); - } - message.put("DataPolicy", region.getAttributes().getDataPolicy().toString()); - - // info.evictionPolicy = - // region.getAttributes().getEvictionAttributes().getAlgorithm(); - - results.setDataObject(message); - return results; - } - - /** - * Returns a java.util.List of LocalRegionInfo objects; - */ - public Object aggregate(List list) - { - ArrayList resultList = new ArrayList(); - for (int i = 0; i < list.size(); i++) { - AggregateResults results = (AggregateResults) list.get(i); - if (results.getCode() == AggregateResults.CODE_ERROR) { - // MapMessage info = new MapMessage(); - // info.put("Code", results.getCode()); - // info.put("CodeMessage", results.getCodeMessage()); - // info.put("RegionPath", regionPath); - // resultList.add(info); - // break; - // ignore - occurs only if undefined region - continue; - } - if (results.getDataObject() != null) { - resultList.add(results.getDataObject()); - } - } - return resultList; - } - - public Object aggregateDistributedSystems(Object[] results) - { - ArrayList list = new ArrayList(); - for (int i = 0; i < results.length; i++) { - list.add(results[i]); - } - return list; - } - - public void fromData(DataInput input) throws IOException, ClassNotFoundException - { - regionPath = DataSerializer.readString(input); - } - - public void toData(DataOutput output) throws IOException - { - DataSerializer.writeString(regionPath, output); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionCreateFunction.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionCreateFunction.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionCreateFunction.java deleted file mode 100644 index f43b356..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionCreateFunction.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.aggregator.functions.util; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.gemstone.gemfire.DataSerializable; -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.cache.execute.FunctionContext; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateFunction; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateResults; -import com.gemstone.gemfire.internal.tools.gfsh.app.command.task.RegionCreateTask; - -public class RegionCreateFunction implements AggregateFunction, DataSerializable -{ - private static final long serialVersionUID = 1L; - - private RegionCreateTask regionCreateTask; - - public RegionCreateFunction() - { - } - - public RegionCreateFunction(RegionCreateTask regionCreateTask) - { - this.regionCreateTask = regionCreateTask; - } - - public RegionCreateTask getRegionCreateAllTask() - { - return regionCreateTask; - } - - public void setRegionCreateAllTask(RegionCreateTask regionCreateAllTask) - { - this.regionCreateTask = regionCreateAllTask; - } - - public AggregateResults run(FunctionContext context) - { - AggregateResults results = new AggregateResults(); - results.setDataObject(regionCreateTask.runTask(null)); - return results; - } - - /** - * Returns a java.util.List of LocalRegionInfo objects; - */ - public Object aggregate(List list) - { - ArrayList resultList = new ArrayList(); - for (int i = 0; i < list.size(); i++) { - AggregateResults results = (AggregateResults)list.get(i); - if (results.getDataObject() != null) { - resultList.add(results.getDataObject()); - } - } - return resultList; - } - - public Object aggregateDistributedSystems(Object[] results) - { - ArrayList list = new ArrayList(); - for (int i = 0; i < results.length; i++) { - list.add(results[i]); - } - return list; - } - - public void fromData(DataInput input) throws IOException, ClassNotFoundException - { - regionCreateTask = (RegionCreateTask)DataSerializer.readObject(input); - } - - public void toData(DataOutput output) throws IOException - { - DataSerializer.writeObject(regionCreateTask, output); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionDestroyFunction.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionDestroyFunction.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionDestroyFunction.java deleted file mode 100644 index fc1b031..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/aggregator/functions/util/RegionDestroyFunction.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.aggregator.functions.util; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.gemstone.gemfire.DataSerializable; -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.cache.execute.FunctionContext; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateFunction; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateResults; -import com.gemstone.gemfire.internal.tools.gfsh.app.command.task.RegionDestroyTask; - -public class RegionDestroyFunction implements AggregateFunction, DataSerializable -{ - private static final long serialVersionUID = 1L; - - private RegionDestroyTask regionDestroyTask; - - public RegionDestroyFunction() - { - } - - public RegionDestroyFunction(String regionPath) - { - this.regionDestroyTask = new RegionDestroyTask(regionPath); - } - - public RegionDestroyFunction(RegionDestroyTask regionDestroyTask) - { - this.regionDestroyTask = regionDestroyTask; - } - - public RegionDestroyTask getRegionDestroyTask() - { - return regionDestroyTask; - } - - public void setRegionCreateAllTask(RegionDestroyTask regionDestroyTask) - { - this.regionDestroyTask = regionDestroyTask; - } - - public AggregateResults run(FunctionContext context) - { - AggregateResults results = new AggregateResults(); - results.setDataObject(regionDestroyTask.runTask(null)); - return results; - } - - /** - * Returns a java.util.List of LocalRegionInfo objects; - */ - public Object aggregate(List list) - { - ArrayList resultList = new ArrayList(); - for (int i = 0; i < list.size(); i++) { - AggregateResults results = (AggregateResults)list.get(i); - if (results.getDataObject() != null) { - resultList.add(results.getDataObject()); - } - } - return resultList; - } - - public Object aggregateDistributedSystems(Object[] results) - { - ArrayList list = new ArrayList(); - for (int i = 0; i < results.length; i++) { - list.add(results[i]); - } - return list; - } - - public void fromData(DataInput input) throws IOException, ClassNotFoundException - { - regionDestroyTask = (RegionDestroyTask)DataSerializer.readObject(input); - } - - public void toData(DataOutput output) throws IOException - { - DataSerializer.writeObject(regionDestroyTask, output); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/CacheBase.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/CacheBase.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/CacheBase.java deleted file mode 100644 index f0dc3f6..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/CacheBase.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.cache; - -/*========================================================================= - * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved. - * This product is protected by U.S. and international copyright - * and intellectual property laws. Pivotal products are covered by - * more patents listed at http://www.pivotal.io/patents. - *======================================================================== - */ -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.InetAddress; -import java.text.MessageFormat; -import java.util.Properties; - -import com.gemstone.gemfire.LogWriter; -import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.CacheException; -import com.gemstone.gemfire.cache.CacheExistsException; -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.distributed.DistributedSystem; -import com.gemstone.gemfire.distributed.Locator; -import com.gemstone.gemfire.internal.OSProcess; - -@SuppressWarnings("deprecation") -public class CacheBase -{ - /** - * The system region that holds system-level data for configuration - * and real-time state updates. - */ - public final static String PROPERTY_SYSTEM_REGION_PATH = "systemRegionPath"; - - protected DistributedSystem distributedSystem; - protected Cache cache; - protected LogWriter logger; - - public static void startLocator(String address, int port, String logFile) - throws IOException - { - InetAddress inetAddress = InetAddress.getByName(address); - Locator.startLocatorAndDS(port, new File(logFile), inetAddress, new Properties()); - } - - public CacheBase() - { - } - - protected void initializeCache() throws CacheException, IOException { - - try { - InstantiatorClassLoader.loadDataSerializables(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - open(); - } - - protected void initializeLogStatsResources() { - String gemfirePropertyFile = System.getProperty("gemfirePropertyFile"); - Properties props = new Properties(); - try { - if (gemfirePropertyFile != null) { - File propFile = new File(gemfirePropertyFile); - if (propFile.exists()) { - FileInputStream fis = new FileInputStream(gemfirePropertyFile); - props.load(fis); - fis.close(); - } - } - } catch (IOException e) { - //Ignore here. - } - - String pid = String.valueOf(OSProcess.getId()); - - String logFile = System.getProperty("gemfire.log-file"); - if (logFile == null) { - logFile = props.getProperty("log-file"); - if (logFile == null) { - String gfshLogFileFormat = System.getProperty("gfsh.log-file-format"); - logFile = MessageFormat.format(gfshLogFileFormat, new Object[] { pid }); - System.setProperty("gemfire.log-file", logFile); - } - } - - String statArchive = System.getProperty("gemfire.statistic-archive-file"); - if (statArchive == null) { - statArchive = props.getProperty("statistic-archive-file"); - if (statArchive == null) { - String gfshLogFileFormat = System.getProperty("gfsh.stat-file-format"); - statArchive = MessageFormat.format(gfshLogFileFormat, new Object[] { pid }); - System.setProperty("gemfire.statistic-archive-file", statArchive); - } - } - } - - protected void open() throws IOException { - // Create distributed system properties - Properties properties = new Properties(); - - // Connect to the distributed system - distributedSystem = DistributedSystem.connect(properties); - - try { - // Create cache - cache = CacheFactory.create(distributedSystem); - cache.setLockLease(10); // 10 second time out - - int bridgeServerPort = Integer.getInteger("bridgeServerPort", 0).intValue(); - String groups = System.getProperty("serverGroups"); - String[] serverGroups = null; - if (groups != null) { - serverGroups = groups.split(","); - } - if (bridgeServerPort != 0) { - cache.setIsServer(true); - com.gemstone.gemfire.cache.server.CacheServer server = cache.addCacheServer(); - server.setPort(bridgeServerPort); - server.setNotifyBySubscription(true); - server.setGroups(serverGroups); - server.start(); - } - } catch (CacheExistsException ex) { - cache = CacheFactory.getAnyInstance(); - } - if (cache != null) { - logger = cache.getLogger(); - } - } - - protected void close() - { - if (cache != null) { - cache.close(); - } - } - - public DistributedSystem getDistributedSystem() - { - return distributedSystem; - } - - public Cache getGemFireCache() - { - return cache; - } - -// Findbugs - wait not in loop - also seems unused code - public void waitForever() throws InterruptedException { - Object obj = new Object(); - synchronized (obj) { - obj.wait(); - } - } - - public LogWriter getLogger() - { - return cache.getLogger(); - } - - public static void main(String[] args) throws Exception { - CacheBase base = new CacheBase(); - base.initializeCache(); - } - - public Cache getCache() - { - return cache; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/InstantiatorClassLoader.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/InstantiatorClassLoader.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/InstantiatorClassLoader.java deleted file mode 100644 index f5de572..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/InstantiatorClassLoader.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.cache; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.LineNumberReader; - -public class InstantiatorClassLoader -{ - /** - * Loads the DataSerializable classes from the relative file path - * specified by the system property "dataSerializableFilePath". If not - * defined then the default relative file path, "etc/DataSerializables.txt", - * is read. The file must contain fully-qualified class names separated - * by a new line. Lines that begin with # or that have white spaces only - * are ignored. For example, - * <p> - * <table cellpadding=0 cellspacing=0> - * <tr># Trade objects</tr> - * <tr>foo.data.Trade</tr> - * <tr>foo.data.Price</tr> - * <tr>foo.data.Order</tr> - * <tr># - * <tr># Info objects</tr> - * <tr>foo.info.Company</tr> - * <tr>foo.info.Employee</tr> - * <tr>foo.info.Customer</tr> - * </table> - * - * @throws IOException Thrown if unable to read the file. - * @throws ClassNotFoundException Thrown if any one of classes in the file is - * undefined. - * @return Returns a comma separated list of loaded class paths. - */ - public static String loadDataSerializables() throws IOException, ClassNotFoundException - { - String dataSerializableFilePath = System.getProperty("dataSerializableFilePath", "etc/DataSerializables.txt"); - return loadDataSerializables(dataSerializableFilePath); - } - - /** - * Loads the DataSerializable classes from the specified relative file path. - * The file must contain fully-qualified class names separated - * by a new line. Lines that begin with # or that have white spaces only - * are ignored. For example, - * <p> - * <table cellpadding=0 cellspacing=0> - * <tr># Trade objects</tr> - * <tr>foo.data.Trade</tr> - * <tr>foo.data.Price</tr> - * <tr>foo.data.Order</tr> - * <tr># - * <tr># Info objects</tr> - * <tr>foo.info.Company</tr> - * <tr>foo.info.Employee</tr> - * <tr>foo.info.Customer</tr> - * </table> - * - * @param filePath The relative or absolute file path. - * @return Returns a comma separated list of loaded class paths. - * @throws IOException Thrown if unable to read the file. - * @throws ClassNotFoundException Thrown if any one of classes in the file is - * undefined. - */ - public static String loadDataSerializables(String filePath) throws IOException, ClassNotFoundException - { - filePath = filePath.trim(); - File file; - if (filePath.startsWith("/") || filePath.indexOf(':') >= 0) { - // absolute path - file = new File(filePath); - } else { - String userDir = System.getProperty("user.dir"); - file = new File(userDir, filePath); - } - - LineNumberReader reader = new LineNumberReader(new FileReader(file)); - String line = reader.readLine(); - String className; - StringBuffer buffer = new StringBuffer(1000); - while (line != null) { - className = line.trim(); - if (className.length() > 0 && className.startsWith("#") == false) { - Class.forName(className); - buffer.append(className); - buffer.append(", "); - } - line = reader.readLine(); - } - reader.close(); - String classList; - int endIndex = buffer.lastIndexOf(", "); // 8 - if (endIndex == buffer.length() - 2) { - classList = buffer.substring(0, endIndex); - } else { - classList = buffer.toString(); - } - return classList; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/data/GenericMap.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/data/GenericMap.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/data/GenericMap.java deleted file mode 100644 index 1e2ff5e..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/cache/data/GenericMap.java +++ /dev/null @@ -1,196 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.cache.data; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Collection; - -import com.gemstone.gemfire.DataSerializable; -import com.gemstone.gemfire.DataSerializer; - -public interface GenericMap extends DataSerializable -{ - public Entry add(String key, GenericMap value); - public Entry add(String key, Mappable value); - public Entry add(String key, String value); - public Entry add(String key, boolean value); - public Entry add(String key, byte value); - public Entry add(String key, short value); - public Entry add(String key, int value); - public Entry add(String key, long value); - public Entry add(String key, float value); - public Entry add(String key, double value); - public Entry addEntry(Entry entry); - public Entry getEntry(int index); - public Entry getEntry(String key); - public Object getValue(String key); - public boolean getBoolean(String key) throws NoSuchFieldException, InvalidTypeException; - public byte getByte(String key) throws NoSuchFieldException, InvalidTypeException; - public char getChar(String key) throws NoSuchFieldException, InvalidTypeException; - public short getShort(String key) throws NoSuchFieldException, InvalidTypeException; - public int getInt(String key) throws NoSuchFieldException, InvalidTypeException; - public long getLong(String key) throws NoSuchFieldException, InvalidTypeException; - public float getFloat(String key) throws NoSuchFieldException, InvalidTypeException; - public double getDouble(String key) throws NoSuchFieldException, InvalidTypeException; - public String getString(String key) throws NoSuchFieldException, InvalidTypeException; - public Entry getEntryAt(int index); - public Object getValueAt(int index); - public String getNameAt(int index); - public int indexOf(String key); - public int lastIndexOf(String key); - public Entry getLastEntry(); - public Object getLastValue(); - public Entry getFirstEntry(); - public Object getFirstValue(); - public boolean hasGenericData(); - public boolean remove(Entry entry); - public Entry remove(int index); - public Collection getEntries(); - public int size(); - public Entry[] getAllEntries(); - public Entry[] getAllPrimitives(); - public int getPrimitiveCount(); - public Entry[] getAllGenericData(); - public int getGenericDataCount(); - public void clear(); - public void dump(OutputStream out); - public Object clone(); - - /** - * Entry is an element that contains a (key, value) pair. This - * class is exclusively used by GenericMessage. - */ - public static class Entry implements DataSerializable - { - /** - * The value type is TYPE_OBJECT if it is a non-primitive and non-MapMessage - * type. - */ - public final static byte TYPE_GENERIC_DATA = 1; - - /** - * The value type is TYPE_MAPPABLE if it is Mappable type. - */ - public final static byte TYPE_MAPPABLE = 2; - - public final static byte TYPE_BYTE = 3; - public final static byte TYPE_CHAR = 4; - public final static byte TYPE_DOUBLE = 5; - public final static byte TYPE_FLOAT = 6; - public final static byte TYPE_INTEGER = 7; - public final static byte TYPE_LONG = 8; - public final static byte TYPE_SHORT = 9; - public final static byte TYPE_BOOLEAN = 10; - public final static byte TYPE_STRING = 11; - - private byte type = TYPE_GENERIC_DATA; - private String key; - private Object value; - - public Entry() - { - } - - /** - * Creates a new Entry object. - * @param key The key identifying the value. - * @param value The value. - * @param type The value type. - */ - public Entry(String key, Object value, byte type) - { - this.key = key; - this.value = value; - this.type = type; - } - - /** - * Creates a new Entry object. The value type is set to the default - * type TYPE_GENERIC_DATA. - * @param key The key identifying the value. - * @param value The value. - */ - public Entry(String key, GenericMap value) - { - this(key, value, TYPE_GENERIC_DATA); - } - - /** - * Returns the key identifying the value. - */ - public String getKey() - { - return key; - } - - /** - * Returns the value. - */ - public Object getValue() - { - return value; - } - - /** - * Returns the value type. - */ - public short getType() - { - return type; - } - - public int intValue() throws InvalidTypeException - { - if (type == TYPE_INTEGER) { - return ((Integer)value).intValue(); - } else if (type == TYPE_LONG) { - return ((Long)value).intValue(); - } else if (type == TYPE_BYTE) { - return ((Byte)value).intValue(); - } else if (type == TYPE_CHAR) { - return Character.getNumericValue(((Character)value).charValue()); - } else if (type == TYPE_SHORT) { - return ((Short)value).intValue(); - } else if (type == TYPE_FLOAT) { - return ((Float)value).intValue(); - } else if (type == TYPE_DOUBLE) { - return ((Double)value).intValue(); - } else if (type == TYPE_BOOLEAN) { - if (((Boolean)value).booleanValue()) { - return 1; - } else { - return 0; - } - } else { - throw new InvalidTypeException(value.getClass() + ": Unable to convert object to int."); - } - } - - public boolean isPrimitive() - { - return type == TYPE_BYTE || - type == TYPE_CHAR || - type == TYPE_DOUBLE || - type == TYPE_FLOAT || - type == TYPE_INTEGER || - type == TYPE_LONG || - type == TYPE_SHORT || - type == TYPE_BOOLEAN; - } - - public void fromData(DataInput dataInput) throws IOException, ClassNotFoundException - { - type = dataInput.readByte(); - key = DataSerializer.readString(dataInput); - value = DataSerializer.readObject(dataInput); - } - - public void toData(DataOutput dataOutput) throws IOException - { - dataOutput.writeByte(type); - DataSerializer.writeString(key, dataOutput); - DataSerializer.writeObject(value, dataOutput); - } - } -}
