Return-Path: X-Original-To: apmail-geode-commits-archive@minotaur.apache.org Delivered-To: apmail-geode-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1756C17C36 for ; Tue, 1 Sep 2015 16:49:10 +0000 (UTC) Received: (qmail 46783 invoked by uid 500); 1 Sep 2015 16:49:10 -0000 Delivered-To: apmail-geode-commits-archive@geode.apache.org Received: (qmail 46751 invoked by uid 500); 1 Sep 2015 16:49:10 -0000 Mailing-List: contact commits-help@geode.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.incubator.apache.org Delivered-To: mailing list commits@geode.incubator.apache.org Received: (qmail 46736 invoked by uid 99); 1 Sep 2015 16:49:09 -0000 Received: from Unknown (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Sep 2015 16:49:09 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 61E3D1AB3C3 for ; Tue, 1 Sep 2015 16:49:09 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.774 X-Spam-Level: * X-Spam-Status: No, score=1.774 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.006] autolearn=disabled Received: from mx1-us-west.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id FqNPlsp9rTsS for ; Tue, 1 Sep 2015 16:48:50 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-us-west.apache.org (ASF Mail Server at mx1-us-west.apache.org) with SMTP id B9D7D31C97 for ; Tue, 1 Sep 2015 16:48:40 +0000 (UTC) Received: (qmail 41949 invoked by uid 99); 1 Sep 2015 16:48:40 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Sep 2015 16:48:40 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8C362E0418; Tue, 1 Sep 2015 16:48:40 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: bschuchardt@apache.org To: commits@geode.incubator.apache.org Date: Tue, 01 Sep 2015 16:49:05 -0000 Message-Id: <7a2fb920eb684ecaaf921fdda48ec24d@git.apache.org> In-Reply-To: <9ae3106003544623b2f8b4b613fc68ac@git.apache.org> References: <9ae3106003544623b2f8b4b613fc68ac@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [27/37] incubator-geode git commit: GEODE-287: Remove old gfsh code http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/function/command/which.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/function/command/which.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/function/command/which.java deleted file mode 100644 index df8bcf4..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/function/command/which.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.function.command; - -import java.util.HashMap; -import java.util.TreeMap; - -import com.gemstone.gemfire.cache.Cache; -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.cache.Region; -import com.gemstone.gemfire.cache.partition.PartitionRegionHelper; -import com.gemstone.gemfire.distributed.DistributedMember; -import com.gemstone.gemfire.internal.GemFireVersion; -import com.gemstone.gemfire.internal.cache.PartitionedRegion; -import com.gemstone.gemfire.internal.tools.gfsh.aggregator.AggregateResults; -import com.gemstone.gemfire.internal.tools.gfsh.app.ServerExecutable; -import com.gemstone.gemfire.internal.tools.gfsh.app.function.GfshData; -import com.gemstone.gemfire.internal.tools.gfsh.util.RegionUtil; - -public class which implements ServerExecutable -{ - private byte code = AggregateResults.CODE_NORMAL; - private String codeMessage = null; - - static String major; - static String minor; - static String update; - static String build; - - static { - determineGemFireVersion(); - } - - private static void determineGemFireVersion() - { - String gemfireVersion = GemFireVersion.getGemFireVersion(); - String split[] = gemfireVersion.split("\\."); - - for (int i = 0;i < split.length; i++) { - switch (i) { - case 0: - major = split[i]; - break; - case 1: - minor = split[i]; - break; - case 2: - update = split[i]; - break; - case 3: - build = split[i]; - break; - } - } - } - - public Object execute(String command, String regionPath, Object arg) throws Exception - { - GfshData data = new GfshData(null); - Cache cache = CacheFactory.getAnyInstance(); - - Object args[] = (Object[])arg; - if (args.length < 0) { - code = AggregateResults.CODE_ERROR; - codeMessage = "Key not specified"; - return data; - } - Object key = args[0]; - boolean recursive = false; - if (args.length > 1) { - recursive = (Boolean)args[1]; - } - - try { - TreeMap map = new TreeMap(); - - if (recursive == false) { - - // Find the value from the partitioned region - if (regionPath == null || regionPath.equals("/")) { - code = AggregateResults.CODE_ERROR; - codeMessage = "Invalid region path " + regionPath; - return data; - } - Region region = cache.getRegion(regionPath); - if (region == null) { - code = AggregateResults.CODE_ERROR; - codeMessage = "Undefined region " + regionPath; - return data; - } - - Object value; - DistributedMember primaryMember = null; - if (region instanceof PartitionedRegion) { - PartitionedRegion pr = (PartitionedRegion)region; - Region localRegion = PartitionRegionHelper.getLocalData((PartitionedRegion)region); - value = localRegion.get(key); - primaryMember = PartitionRegionHelper.getPrimaryMemberForKey(region, key); - - // 6.0 - Note that this may or may not work -// int bucketId = PartitionedRegionHelper.getHashKey(pr, Operation.GET, key, null); - - // 6.5 - int bucketId = pr.getKeyInfo(key).getBucketId(); - - DistributedMember member = cache.getDistributedSystem().getDistributedMember(); - boolean isPrimary = member == primaryMember; - HashMap prInfoMap = new HashMap(); - prInfoMap.put("BucketId", bucketId); - prInfoMap.put("IsPrimary", isPrimary); - data.setUserData(prInfoMap); - } else { - value = region.get(key); - } - if (value != null) { - map.put(regionPath, value); - } - - } else { - - // Recursively find the keys starting from the specified region path. - String regionPaths[] = RegionUtil.getAllRegionPaths(cache, true); - for (int i = 0; i < regionPaths.length; i++) { - if (regionPaths[i].startsWith(regionPath)) { - Object value = null; - Region region = cache.getRegion(regionPaths[i]); - - if (region instanceof PartitionedRegion) { - PartitionedRegion pr = (PartitionedRegion)region; - Region localRegion = PartitionRegionHelper.getLocalData(pr); - value = localRegion.get(key); - } else { - value = region.get(key); - } - if (value != null) { - map.put(regionPaths[i], value); - } - } - } - - } - - data.setDataObject(map); - - } catch (Exception ex) { - code = AggregateResults.CODE_ERROR; - codeMessage = ex.getMessage(); - } - return data; - } - - public byte getCode() - { - return code; - } - - public String getCodeMessage() - { - return codeMessage; - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ClassFinder.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ClassFinder.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ClassFinder.java deleted file mode 100644 index b9a062f..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ClassFinder.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.misc.util; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarInputStream; - -import com.gemstone.gemfire.internal.ClassPathLoader; - -public class ClassFinder -{ - - /** - * Returns all classes that are in the specified package. Use this method to find - * inflated classes, i.e., classes that are kept in a directory. Use - * getClasses(String jarPath, String packageName) if the classes are in a jar file. - * - * @param packageName - * The base package - * @return The classes - * @throws ClassNotFoundException Thrown if unable to load a class - * @throws IOException Thrown if error occurs while reading the jar file - */ - public static Class[] getClasses(String packageName) throws ClassNotFoundException, IOException - { - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); -// assert classLoader != null; - String path = packageName.replace('.', '/'); - Enumeration resources = classLoader.getResources(path); - List dirs = new ArrayList(); - while (resources.hasMoreElements()) { - URL resource = (URL)resources.nextElement(); - dirs.add(new File(resource.getFile())); - } - ArrayList classes = new ArrayList(); - for (Iterator iterator = dirs.iterator(); iterator.hasNext();) { - File directory = (File)iterator.next(); - classes.addAll(findClasses(directory, packageName)); - } - return (Class[])classes.toArray(new Class[classes.size()]); - } - - /** - * Returns all classes found in the specified directory. - * - * @param directory - * The base directory - * @param packageName - * The package name for classes found inside the base directory - * @return The classes - * @throws ClassNotFoundException Thrown if unable to load a class - */ - public static List findClasses(File directory, String packageName) throws ClassNotFoundException - { - List classes = new ArrayList(); - if (!directory.exists()) { - return classes; - } - File[] files = directory.listFiles(); - for (int i = 0; i < files.length; i++) { - File file = files[i]; - if (file.isDirectory()) { -// assert !file.getName().contains("."); - classes.addAll(findClasses(file, packageName + "." + file.getName())); - } else if (file.getName().endsWith(".class")) { - classes - .add(Class - .forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); - } - } - return classes; - } - - /** - * Returns all classes that are in the specified jar and package name. - * @param jarPath The absolute or relative jar path. - * @param packageName The package name. - * @return Returns all classes that are in the specified jar and package name. - * @throws ClassNotFoundException Thrown if unable to load a class - * @throws IOException Thrown if error occurs while reading the jar file - */ - public static Class[] getClasses(String jarPath, String packageName) throws ClassNotFoundException, IOException - { - String[] classNames = getClassNames(jarPath, packageName); - Class classes[] = new Class[classNames.length]; - for (int i = 0; i < classNames.length; i++) { - String className = (String)classNames[i]; - classes[i] = Class.forName(className); - } - return classes; - } - - /** - * Returns all names of classes that are defined in the specified jar and package name. - * @param jarPath The absolute or relative jar path. - * @param packageName The package name. - * @return Returns all names of classes that are defined in the specified jar and package name. - * @throws IOException Thrown if error occurs while reading the jar file - */ - public static String[] getClassNames(String jarPath, String packageName) throws IOException - { - if (jarPath == null) { - return new String[0]; - } - - File file; - if (jarPath.startsWith("/") || jarPath.indexOf(':') >= 0) { - // absolute path - file = new File(jarPath); - } else { - // relative path - String workingDir = System.getProperty("user.dir"); - file = new File(workingDir + "/" + jarPath); - } - - ArrayList arrayList = new ArrayList(); - packageName = packageName.replaceAll("\\.", "/"); - JarInputStream jarFile = new JarInputStream(new FileInputStream(file)); - JarEntry jarEntry; - while (true) { - jarEntry = jarFile.getNextJarEntry(); - if (jarEntry == null) { - break; - } - String name = jarEntry.getName(); - if (name.startsWith(packageName) && (name.endsWith(".class"))) { - int endIndex = name.length() - 6; - name = name.replaceAll("/", "\\."); - name = name.substring(0, endIndex); - arrayList.add(name); - } - } - jarFile.close(); - - return (String[])arrayList.toArray(new String[0]); - } - - /** - * Returns all classes that are in the specified jar. - * @param jarPath The absolute or relative jar path. - * @return Returns all classes that are in the specified jar - * @throws ClassNotFoundException Thrown if unable to load a class - * @throws IOException Thrown if error occurs while reading the jar file - */ - public static Class[] getAllClasses(String jarPath) throws ClassNotFoundException, IOException - { - String[] classNames = getAllClassNames(jarPath); - Class classes[] = new Class[classNames.length]; - for (int i = 0; i < classNames.length; i++) { - String className = (String)classNames[i]; - classes[i] = ClassPathLoader.getLatest().forName(className); - } - return classes; - } - - /** - * Returns all names of classes that are defined in the specified jar. - * @param jarPath The absolute or relative jar path. - * @return Returns all names of classes that are defined in the specified jar. - * @throws IOException Thrown if error occurs while reading the jar file - */ - public static String[] getAllClassNames(String jarPath) throws IOException - { - if (jarPath == null) { - return new String[0]; - } - - jarPath = jarPath.trim(); - if (jarPath.length() == 0) { - return new String[0]; - } - - File file; - if (jarPath.startsWith("/") || jarPath.indexOf(':') >= 0) { - // absolute path - file = new File(jarPath); - } else { - // relative path - String workingDir = System.getProperty("user.dir"); - file = new File(workingDir + "/" + jarPath); - } - - ArrayList arrayList = new ArrayList(); - JarInputStream jarFile = new JarInputStream(new FileInputStream(file)); - JarEntry jarEntry; - while (true) { - jarEntry = jarFile.getNextJarEntry(); - if (jarEntry == null) { - break; - } - String name = jarEntry.getName(); - if (name.endsWith(".class")) { - int endIndex = name.length() - 6; - name = name.replaceAll("/", "\\."); - name = name.substring(0, endIndex); - arrayList.add(name); - } - } - jarFile.close(); - - return (String[])arrayList.toArray(new String[0]); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/DataSerializerEx.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/DataSerializerEx.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/DataSerializerEx.java deleted file mode 100644 index 6c77ddf..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/DataSerializerEx.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.misc.util; - - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.internal.DSCODE; - -public abstract class DataSerializerEx extends DataSerializer -{ - /** - * Writes the specified byte array to the output stream. This method is - * not thread safe. - * - * @param array The byte array to compress - * @param buffer The byte array buffer used as input to the deflater. This - * buffer must have enough space to hold the compressed data. - * @param compressor java.util.Deflater. - * @param output The data output stream. - * @throws IOException Thrown if unable to write to the output stream. - */ - public static void writeByteArray(byte array[], byte buffer[], Deflater compressor, DataOutput output) throws IOException - { - // Compress the bytes - compressor.setInput(array); - compressor.finish(); - int compressedDataLength = compressor.deflate(buffer); - DataSerializer.writeByteArray(buffer, compressedDataLength, output); - } - - /** - * Reads byte array from the input stream. This method is not thread safe. - * - * @param buffer The buffer to hold the decompressed data. This buffer - * must be large enough to hold the decompressed data. - * @param decompressor java.util.Inflater - * @param input The data input stream. - * @return Returns the actual byte array (not compressed) read from the - * input stream. - * @throws IOException Thrown if unable to read from the input stream or - * unable to decompress the data. - */ - public static byte[] readByteArray(byte buffer[], Inflater decompressor, DataInput input) throws IOException - { - byte compressedBuffer[] = DataSerializer.readByteArray(input); - // Decompress the bytes - decompressor.setInput(compressedBuffer, 0, compressedBuffer.length); - byte retval[] = null; - try { - int resultLength = decompressor.inflate(buffer); - retval = new byte[resultLength]; - System.arraycopy(compressedBuffer, 0, retval, 0, resultLength); - } catch (DataFormatException e) { - throw new IOException("Unable to decompress the byte array due to a data format error. " + e.getMessage()); - } - return retval; - } - - /** - * Reads UTF string from the input. This method is analogous to - * DataInput.readUTF() except that it supports null string. - * @param input The data input stream. - * @return Returns null or non-null string value. - * @throws IOException Thrown if unable to read from the input stream. - */ - public static String readUTF(DataInput input) throws IOException - { - byte header = input.readByte(); - if (header == DSCODE.NULL_STRING) { - return null; - } - return input.readUTF(); - } - - /** - * Writes the specified sting value to the output stream. This method - * is analogous to DataOutput.writeUTF() except that it supports null - * string. - * @param value The string value to write to the output stream. - * @param output The data output stream. - * @throws IOException Thrown if unable to write to the output stream. - */ - public static void writeUTF(String value, DataOutput output) throws IOException - { - if (value == null) { - output.writeByte(DSCODE.NULL_STRING); - } else { - output.writeByte(DSCODE.STRING); - output.writeUTF(value); - } - } -} - \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherListener.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherListener.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherListener.java deleted file mode 100644 index 9e0a9d5..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherListener.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.misc.util; - -/** - * @author Dae Song Park - * @since 1.0 - */ -public interface QueueDispatcherListener -{ - void objectDispatched(Object obj); -} - http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherThread.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherThread.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherThread.java deleted file mode 100644 index c206d4d..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/QueueDispatcherThread.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.misc.util; - -import java.util.LinkedList; -import java.util.List; -import java.util.Collections; - - -/** - *

Title:

- *

Description:

- *

Copyright: Copyright (c) 2004

- *

Company: GemStone Systems, Inc.

- * @author Dae Song Park - * @version 1.0 - */ -public class QueueDispatcherThread extends Thread -{ - private List list = Collections.synchronizedList(new LinkedList()); - private QueueDispatcherListener queueDispatcherListener; - private boolean shouldRun = true; - - public QueueDispatcherThread() - { - setDaemon(true); - } - - public synchronized void enqueue(Object obj) - { - list.add(obj); - this.notify(); - } - - public synchronized Object dequeue() throws InterruptedException - { - while (list.size() == 0) { - this.wait(1000); - } - return list.remove(0); - } - - public int size() - { - return list.size(); - } - - public boolean isEmpty() - { - return list.size() == 0; - } - - public void setQueueDispatcherListener(QueueDispatcherListener listener) - { - this.queueDispatcherListener = listener; - } - - public QueueDispatcherListener getQueueDispatcherListener() - { - return queueDispatcherListener; - } - - public synchronized void run() - { - while (shouldRun) { - try { - while (list.size() == 0 && shouldRun) { - this.wait(1000); - } - int size = list.size(); - if (size > 0) { - for (int i = 0; i < size; i++) { - Object obj = list.remove(0); - if (queueDispatcherListener != null) { - queueDispatcherListener.objectDispatched(obj); - } - } - } - } catch (InterruptedException ex) { - // ignore for the time being - } - } - } - - public void terminate() - { - shouldRun = false; - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ReflectionUtil.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ReflectionUtil.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ReflectionUtil.java deleted file mode 100644 index bf12eb7..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/ReflectionUtil.java +++ /dev/null @@ -1,303 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.misc.util; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Collection; -import java.util.Map; -import java.util.TreeMap; - - - -public class ReflectionUtil -{ - /** - * Returns the values of all the public members in the specified object. - * The returned value has the format: member1 = value1, member2 = value2, ... - */ - public static String toStringPublicMembers(Object object) - { - if (object == null) { - return null; - } - - String retval = ""; - Class cls = object.getClass(); - Field fields[] = cls.getFields(); - String name; - Object value; - try { - for (int i = 0; i < fields.length; i++) { - name = fields[i].getName(); - value = fields[i].get(object); - if (value instanceof byte[]) { - value = new String((byte[])value); - } else if (value instanceof Byte) { - value = ((Byte)value).toString(); - } - retval += name + " = " + value + ", "; - } - } catch (IllegalAccessException ex) { - ex.printStackTrace(); - } - - // Remove the trailing ", ". - if (retval.length() > 0) { - retval = retval.substring(0, retval.length() - 2); - } - return retval; - } - - public static String toStringGetters(Object object) - { - if (object == null) { - return null; - } - - String retval = ""; - Class cls = object.getClass(); - Method methods[] = cls.getMethods(); - Method method; - Class retType; - String name; - Object value; - try { - for (int i = 0; i < methods.length; i++) { - method = methods[i]; - name = method.getName(); - if (name.length() <= 3 || name.startsWith("get") == false) { - continue; - } - if ((method.getModifiers() & Modifier.STATIC) > 0) { - continue; - } - if (name.equals("getClass")) { - continue; - } - retType = method.getReturnType(); - if (retType == Void.TYPE) { - continue; - } - try { - value = method.invoke(object, (Object[])null); - if (value instanceof byte[]) { - value = new String((byte[])value); - } else if (value instanceof Byte) { - value = ((Byte)value).toString(); - } - retval += name.substring(3) + " = " + value + ", "; - } catch (Exception ex) { - } - } - - } catch (Exception ex) { - ex.printStackTrace(); - } - - // Remove the trailing ", ". - if (retval.length() > 0) { - retval = retval.substring(0, retval.length() - 2); - } - return retval; - } - - public static String toStringGettersAnd(Object object) - { - if (object == null) { - return null; - } - - String retval = ""; - Class cls = object.getClass(); - Method methods[] = cls.getMethods(); - Method method; - Class retType; - String name; - Object value; - try { - for (int i = 0; i < methods.length; i++) { - method = methods[i]; - name = method.getName(); - if (name.length() <= 3 || name.startsWith("get") == false) { - continue; - } - if ((method.getModifiers() & Modifier.STATIC) > 0) { - continue; - } - if (name.equals("getClass")) { - continue; - } - retType = method.getReturnType(); - if (retType == Void.TYPE) { - continue; - } - try { - value = method.invoke(object, (Object[])null); - if (value instanceof byte[]) { - value = new String((byte[])value); - } else if (value instanceof Byte) { - value = ((Byte)value).toString(); - } - if (value instanceof String) { - retval += name.substring(3) + "='" + value + "' and "; - } else { - retval += name.substring(3) + "=" + value + " and "; - } - } catch (Exception ex) { - } - } - - } catch (Exception ex) { - ex.printStackTrace(); - } - - // Remove the trailing " and ". - if (retval.length() > 0) { - retval = retval.substring(0, retval.length() - 5); - } - return retval; - } - - public static String toStringSetters(Object object) - { - if (object == null) { - return null; - } - - String retval = ""; - Class cls = object.getClass(); - Method methods[] = cls.getMethods(); - Method method; - String name; - try { - for (int i = 0; i < methods.length; i++) { - method = methods[i]; - name = method.getName(); - if (name.length() <= 3 || name.startsWith("set") == false) { - continue; - } - retval += name + ", "; - } - - } catch (Exception ex) { - ex.printStackTrace(); - } - - // Remove the trailing ", ". - if (retval.length() > 0) { - retval = retval.substring(0, retval.length() - 2); - } - return retval; - } - - public static Method[] getAllSetters(Class cls) - { - Map map = getAllSettersMap(cls); - if (map == null) { - return null; - } - Collection col = map.values(); - return (Method[])col.toArray(new Method[0]); - } - - public static Map getAllSettersMap(Class cls) - { - if (cls == null) { - return null; - } - Method methods[] = cls.getMethods(); - TreeMap map = new TreeMap(); - Method method; - String name; - try { - for (int i = 0; i < methods.length; i++) { - method = methods[i]; - name = method.getName(); - if (name.length() <= 3 || name.startsWith("set") == false) { - continue; - } - if (method.getParameterTypes().length == 1) { - map.put(method.getName(), method); - } - } - - } catch (Exception ex) { - ex.printStackTrace(); - } - - return map; - } - - - public static Method[] getAllGetters(Class cls) - { - Map map = getAllGettersMap(cls); - if (map == null) { - return null; - } - Collection col = map.values(); - return (Method[])col.toArray(new Method[0]); - } - - /** - * Returns Map - * @param cls - */ - public static Map getAllGettersMap(Class cls) - { - if (cls == null) { - return null; - } - Method methods[] = cls.getMethods(); - Method method; - Class retType; - String name; - TreeMap map = new TreeMap(); - try { - for (int i = 0; i < methods.length; i++) { - method = methods[i]; - name = method.getName(); - if (name.length() <= 3 || name.startsWith("get") == false) { - continue; - } - if ((method.getModifiers() & Modifier.STATIC) > 0) { - continue; - } - if (name.equals("getClass")) { - continue; - } - retType = method.getReturnType(); - if (retType == Void.TYPE) { - continue; - } - if (method.getParameterTypes().length == 0) { - map.put(name, method); - } - } - - } catch (Exception ex) { - ex.printStackTrace(); - } - - return map; - } - - /** - * - * @param cls - * @return setter map - * @deprecated - *///FIXME: java docs @return, check if this is used? - public static Map getSetterMap(Class cls) - { - TreeMap map = new TreeMap(); - Method methods[] = getAllSetters(cls); - String memberName; - for (int i = 0; i < methods.length; i++) { - memberName = methods[i].getName(); - memberName = memberName.substring(3); - map.put(memberName, methods[i]); - } - return map; - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/StringUtil.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/StringUtil.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/StringUtil.java deleted file mode 100644 index 2d97aef..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/StringUtil.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.misc.util; - -public class StringUtil -{ - /** - * Returns the short name of the fully-qualified class name. - * @param className The fully-qualified class name. - */ - public static String getShortClassName(String className) - { - if (className == null) { - return null; - } - String shortName = null; - int index = className.lastIndexOf('.'); - if (index == -1 || index >= className.length()-1) { - shortName = className; - } else { - shortName = className.substring(index+1); - } - return shortName; - } - - /** - * Returns the short class name of the specified object. - * @param obj The object from which its short name is to be derived. - */ - public static String getShortClassName(Object obj) - { - if (obj == null) { - return null; - } - return getShortClassName(obj.getClass().getName()); - } - - /** - * Trims the matching character found in the left end of the string. - * @param str The string to trim. - * @param c The character remove. - */ - public static String trimLeft(String str, char c) - { - int len = str.length(); - int index = 0; - while (index < len && str.charAt(index++) == c); - index--; - if (index < 0) { - return ""; - } else if (index < len) { - return str.substring(index); - } else { - return str; - } - } - - /** - * Trims the matching character found in right end of the string. - * @param str The string to trim. - * @param c The character remove. - */ - public static String trimRight(String str, char c) - { - int len = str.length(); - int index = len - 1; - while (index >= 0 && str.charAt(index--) == c); - index++; - if (index > len - 1) { - return str; - } else if (index >= 0) { - return str.substring(0, index + 1); - } else { - return ""; - } - } - - /** - * Trims all of the matching character in the string. - * @param str The string to trim. - * @param c The character remove. - */ - public static String trim(String str, char c) - { - return trimRight(trimLeft(str, c), c); - } - - /** - * Replaces the all of the matching oldValue in the string with the newValue. - * @param str The string to replace matching substring. - * @param oldValue The old value to match and replace. - * @param newValue The new value to replace the old value with. - */ - public static String replace(String str, String oldValue, String newValue) - { - if (str == null || oldValue == null || newValue == null) { - return null; - } - - int index = str.indexOf(oldValue); - if (index != -1) { - int oldValueLen = oldValue.length(); - int newValueLen = newValue.length(); - String head; - String tail = str; - StringBuffer buffer = new StringBuffer(str.length() + newValueLen); - do { - head = tail.substring(0, index); - buffer.append(head); - buffer.append(newValue); - tail = tail.substring(index+oldValueLen); - index = tail.indexOf(oldValue); - } while (index != -1); - buffer.append(tail); - - str = buffer.toString(); - } - - return str; - } - - public static String getLeftPaddedString(String value, int maxSize, char pad) - { - int diff = maxSize - value.length(); - StringBuffer buffer = new StringBuffer(maxSize); - for (int i = 0; i < diff; i++) { - buffer.append(pad); - } - buffer.append(value); - return buffer.toString(); - } - - public static String getRightPaddedString(String value, int maxSize, char pad) - { - int diff = maxSize - value.length(); - StringBuffer buffer = new StringBuffer(maxSize); - buffer.append(value); - for (int i = 0; i < diff; i++) { - buffer.append(pad); - } - return buffer.toString(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/SystemClassPathManager.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/SystemClassPathManager.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/SystemClassPathManager.java deleted file mode 100644 index 0149aa8..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/misc/util/SystemClassPathManager.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.misc.util; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Method; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import com.gemstone.gemfire.SystemFailure; -import com.gemstone.gemfire.cache.CacheFactory; -import com.gemstone.gemfire.internal.tools.gfsh.app.pogo.KeyType; -import com.gemstone.gemfire.internal.tools.gfsh.app.pogo.KeyTypeManager; - -/** - * SystemClassPathManager assigns the class path to the system class loader - * in runtime. - * @author dpark - * - */ -public class SystemClassPathManager -{ - private static final Class[] parameters = new Class[] { URL.class }; - - public static void addFile(String s) throws IOException - { - File f = new File(s); - addFile(f); - } - - public static void addFile(File f) throws IOException - { - addURL(f.toURI().toURL()); - } - - public static void addURL(URL u) throws IOException - { - - URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader(); - Class sysclass = URLClassLoader.class; - - try { - Method method = sysclass.getDeclaredMethod("addURL", parameters); - method.setAccessible(true); - method.invoke(sysloader, new Object[] { u }); - } catch (VirtualMachineError e) { - SystemFailure.initiateFailure(e); - throw e; - } catch (Throwable t) { - SystemFailure.checkFailure(); - t.printStackTrace(); - throw new IOException("Error, could not add URL to system classloader"); - } - - } - - /** - * Includes all of the jar files in the specified directory in the - * class path. It first includes the latest dated jar files that end - * with the extension '.vyyyyMMddHHmm.jar'. For example, if there are - * 'foo.v201010231217' and 'foo.v201010221011' then only the formal is - * added in the class path since it has the latest version date. - *

- * Once all of the date-versioned jar files are added, it then proceed - * to add the rest of the jar files in sorted order. - *

- * It also auto registers versioned classes such as MapLite's KeyType. - * - * @param dirPath The absolute or relative directory path. - */ - public static void addJarsInDir(String dirPath) - { - if (dirPath == null) { - return; - } - - File classDirFile = new File(dirPath); - classDirFile.mkdirs(); - - ArrayList jarList = new ArrayList(); - File[] files = classDirFile.listFiles(); - for (File file : files) { - if (file.isFile()) { - String fileName = file.getName(); - jarList.add(file.getAbsolutePath()); - } - } - - // Register the latest files only - Collections.sort(jarList); - String prevFileNameNoDate = ""; - ArrayList datedFiles = new ArrayList(); - ArrayList notDatedFiles = new ArrayList(); - for (int i = jarList.size() - 1; i >= 0; i--) { - String filePath = jarList.get(i); - if (filePath.endsWith(".jar") == false) { - continue; - } - File file = new File(filePath); - String fileName = file.getName(); - String nameNoExtension = fileName.substring(0, fileName.lastIndexOf(".jar")); - int index = nameNoExtension.lastIndexOf(".v"); - if (index == -1) { - // not dated - notDatedFiles.add(file); - continue; - } - String fileNameNoDate = nameNoExtension.substring(0, index); - if (fileNameNoDate.equals(prevFileNameNoDate) == false) { - try { - SystemClassPathManager.addFile(file); - datedFiles.add(file); - } catch (IOException e) { - CacheFactory.getAnyInstance().getLogger().error(e); - } - prevFileNameNoDate = fileNameNoDate; - } - } - - // Add the not dated files - dated files take precedence - Collections.sort(notDatedFiles); - for (File file : notDatedFiles) { - try { - SystemClassPathManager.addFile(file); - } catch (IOException e) { - CacheFactory.getAnyInstance().getLogger().error(e); - } - } - - // Register KeyTypes for dated classes - registerKeyType(datedFiles); - - // Register KeyTypes for not dated classes - registerKeyType(notDatedFiles); - - // for gc - datedFiles.clear(); - datedFiles = null; - notDatedFiles.clear(); - notDatedFiles = null; - jarList.clear(); - jarList = null; - } - - private static void registerKeyType(List files) - { - for (File file : files) { - try { - Class[] classes = ClassFinder.getAllClasses(file.getAbsolutePath()); - for (int j = 0; j < classes.length; j++) { - Class cls = classes[j]; - if (KeyType.class.isAssignableFrom(cls) && - cls.getSimpleName().matches(".*_v\\d++$")) - { - try { - Method method = cls.getMethod("getKeyType", (Class[])null); - KeyType keyType = (KeyType)method.invoke(cls, (Object[])null); - KeyTypeManager.registerSingleKeyType(keyType); - } catch (Exception ex) { - // ignore - } - } - } - } catch (Exception ex) { - // ignore - } - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/InvalidKeyException.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/InvalidKeyException.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/InvalidKeyException.java deleted file mode 100644 index c8a098f..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/InvalidKeyException.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.pogo; - -import com.gemstone.gemfire.GemFireException; - -/** - * InvalidKeyException is a runtime exception thrown if the key type - * is invalid. This can occur when the incorrect type value is put in - * the message (MapLite) class. - * - * @author dpark - * - */ -public class InvalidKeyException extends GemFireException -{ - private static final long serialVersionUID = 1L; - - /** - * Creates a new InvalidKeyException with the specified - * message. - */ - public InvalidKeyException(String message) - { - super(message); - } - - /** - * Creates a new InvalidKeyException wit the specified - * message and exception. - */ - public InvalidKeyException(String message, Throwable ex) - { - super(message, ex); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyType.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyType.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyType.java deleted file mode 100644 index 054488a..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyType.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.pogo; - -import java.util.Set; - -/** - * KeyType represents the schema definitions for predefining keys for - * lightweight self-describing message classes such as MapLite provided - * in this package. - * @author dpark - * - */ -public interface KeyType -{ - /** - * Return the universal ID that uniquely represents the key type across - * space and time. The underlying message class implementation must - * guarantee the uniqueness of this ID to properly marshal objects - * crossing network and language boundaries. This ID is static and - * permanent for the life of the key type class. - */ - public Object getId(); - - /** - * Returns the version number. - */ - public int getVersion(); - - /** - * Returns the key count. - */ - public int getKeyCount(); - - /** - * Returns the index of the key. - */ - public int getIndex(); - - /** - * Returns the name of the key. - */ - public String getName(); - - /** - * Returns the class of the key. - */ - public Class getType(); - - /** - * Returns the entire keys. - */ - public KeyType[] getValues(); - - /** - * Returns the entire keys of the specified version. - * @param version The version number. - */ - public KeyType[] getValues(int version); - - /** - * Returns the key of the specified key name. - * @param name The key name. - */ - public KeyType getKeyType(String name); - - /** - * Returns true if delta propagation is enabled. - */ - public boolean isDeltaEnabled(); - - /** - * Returns true if the key value is to be kept serialized until - * it is accessed. This applies per key instance. - */ - public boolean isKeyKeepSerialized(); - - /** - * Returns true if the network payload is to be compressed. - */ - public boolean isCompressionEnabled(); - - /** - * Returns true if any of the key values is to be kept serialized. - */ - public boolean isPayloadKeepSerialized(); - - /** - * Returns the key name set. - */ - public Set getNameSet(); - - /** - * Returns true if the specified key is defined. - * @param name The key to check. - */ - public boolean containsKey(String name); -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyTypeManager.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyTypeManager.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyTypeManager.java deleted file mode 100644 index 5794c88..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/KeyTypeManager.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.pogo; - -import java.lang.reflect.Field; -import java.util.Map; -import java.util.TreeMap; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -import com.gemstone.gemfire.DataSerializable; -import com.gemstone.gemfire.Instantiator; - -/** - * KeyTypeManager manages the key type classes for the process life time. - * Each key type class requires registration through KeyTypeManager in - * order to activate them within the process boundary. Using a key type - * without registering may fail as the underlying marshaling mechanism is - * maybe unable to properly map the key type. - * - * @author dpark - * - */ -public class KeyTypeManager -{ - - /** - * Map of key types. - */ - private static ConcurrentHashMap> uuidMap = new ConcurrentHashMap>(); - - /** - * Registers the specified key type. It assumes that all of the KeyType - * version classes are in the "pogo" sub-package as the specified KeyType. - * @param keyTypeName The fully qualified KeyType class name without - * the version number, i.e., com.foo.orders.FOrder - * as opposed to com.foo.orders.pogo.FOrder_v1. - */ -//FindBugs - private method never called -// private static void registerKeyType(String keyTypeName) -// { -// if (keyTypeName == null) { -// return; -// } -// Class cls; -// try { -// cls = Class.forName(keyTypeName); -// KeyType keyType = (KeyType)cls.newInstance(); -// registerKeyType(keyType); -// } catch (Exception e) { -// // ignore -// } -// } - - /** - * Registers the specified key type and all of the previous versions. - * A key type must be registered before it can be used by the application. - * @param keyType The key type to register. - */ - public static void registerKeyType(KeyType keyType) - { - if (keyType == null) { - return; - } - - registerSingleKeyType(keyType); - - Package pkg = keyType.getClass().getPackage(); - String keyTypeName; - if (pkg == null) { - keyTypeName = "pogo." + keyType.getClass().getSimpleName(); - } else { - keyTypeName = pkg.getName() + ".pogo." + keyType.getClass().getSimpleName(); - } - - int version = keyType.getVersion(); - do { - try { - Class cls = Class.forName(keyTypeName + "_v" + version); - if (cls.isEnum() == false) { - break; - } - Object[] consts = cls.getEnumConstants(); - if (consts != null && consts.length > 0 && consts[0] instanceof KeyType) { - KeyType ft = (KeyType)consts[0]; - registerSingleKeyType(ft); - } - } catch (ClassNotFoundException e) { - break; - } - version--; - - } while (true); - } - - /** - * Registers the specified key type only. It will not register the - * previous versions. - * @param keyType The key type to register - */ - public static void registerSingleKeyType(KeyType keyType) - { - if (keyType == null) { - return; - } - Map map = uuidMap.get(keyType.getId()); - if (map == null) { - map = new TreeMap(); - uuidMap.put((UUID)keyType.getId(), map); - } - map.put(keyType.getVersion(), keyType); - } - - /** - * Returns true if the specified key type has been registered previously. - * @param keyType The key type to check. - */ - public static boolean isRegistered(KeyType keyType) - { - if (keyType == null) { - return false; - } - Map map = uuidMap.get(keyType.getId()); - if (map == null) { - return false; - } - return map.get(keyType.getVersion()) != null; - } - - /** - * Loads a new key type. The main key type points to this key - * type. - * Experimental - NOT USED - * @param keyType - */ - private static void loadKeyType(KeyType keyType) - { - registerKeyType(keyType); - Package pkg = keyType.getClass().getPackage(); - String keyTypeName = pkg.getName() + keyType.getClass().getSimpleName(); - try { - Class cls = Class.forName(keyTypeName); - Field field = cls.getField("VERSION"); - field.setInt(field, keyType.getVersion()); - } catch (ClassNotFoundException e) { - return; - } catch (NoSuchFieldException e) { - return; - } catch (IllegalAccessException e) { - return; - } - } - - /** - * Returns the key type of the specified UUID most significant bits, - * least significant bits and version. - * - * @param uuidMostSigBits The most significant bits. - * @param uuidLeastSigBits The least significant bits. - * @param version The version number. - * @return Returns the key type of the specified UUID most significant - * bits, least significant bits and version. It returns null if - * the key type is not found. - */ - public static KeyType getKeyType(long uuidMostSigBits, long uuidLeastSigBits, int version) - { - return getKeyType(new UUID(uuidMostSigBits, uuidLeastSigBits), version); - } - - /** - * Returns the key type of the specified UUID and version. - * @param uuid The UUID representing the key type. - * @param version The version number. - * @return Returns the key type of the specified UUID and version. It - * returns null if the key type is not found. - */ - public static KeyType getKeyType(UUID uuid, int version) - { - Map map = uuidMap.get(uuid); - if (map == null) { - return null; - } - return map.get(version); - } - - /** - * Returns the entire key type instances of the specified version. - * @param keyType The key type. - * @param version The version number. - * @return Returns the entire key type instances of the specified version. - * It returns null if the key types are not found. - */ - public static KeyType[] getValues(KeyType keyType, int version) - { - KeyType ft = getKeyType((UUID)keyType.getId(), version); - if (ft == null) { - return null; - } - return ft.getValues(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/49d99d4e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLite.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLite.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLite.java deleted file mode 100644 index b792147..0000000 --- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/tools/gfsh/app/pogo/MapLite.java +++ /dev/null @@ -1,1136 +0,0 @@ -package com.gemstone.gemfire.internal.tools.gfsh.app.pogo; - -import java.io.ByteArrayInputStream; -import java.io.DataInput; -import java.io.DataInputStream; -import java.io.DataOutput; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.UUID; - -import com.gemstone.gemfire.DataSerializable; -import com.gemstone.gemfire.DataSerializer; -import com.gemstone.gemfire.Delta; -import com.gemstone.gemfire.InvalidDeltaException; -import com.gemstone.gemfire.internal.HeapDataOutputStream; -import com.gemstone.gemfire.internal.Version; - -/** - * MapLite is a GemFire data class for efficiently storing and retrieving data - * to/from GemFire data fabrics. It is a lightweight map class designed for - * delivering self-describing messages over the network without the cost of - * embedded keys in the wire format. MapLite achieves this by predefining the - * keys in the form of enum (and String) constants and deploying them as part of - * the application binary classes. The enum key classes are automatically - * versioned and generated using the provided IDE plug-in, ensuring full - * compatibility and coexistence with other versions. - *

- * In addition to the code generator, MapLite includes the following GemFire - * cache optimization and operational features while maintaining the same level - * of self-describing message accessibility. - *

- *

    - *
  • MapLite is fully POGO compliant.
  • - *
  • MapLite implements {@link java.util.Map}.
  • - *
  • MapLite and POGO are in general significantly lighter than POJO and - * {@link HashMap}. Its wire format is compact and does not require class - * reflection.
  • - *
  • MapLite and POGO are faster than POJO and HashMap. Its smaller payload - * size means it is serialized and delivered faster.
  • - *
  • MapLite lookup is faster than HashMap. MapLite keeps values internally - * indexed in an array for faster access.
  • - *
  • MapLite fully supports GemFire delta propagation. - *
  • MapLite fully supports selective key inflation (SKI). With SKI, the - * underlying POGO mechanism inflates only the values that are accessed by the - * application. The rest of the values are kept deflated until they are - * accessed. This reduces the memory footprint and eliminates the unnecessary - * latency overhead introduced by the serialization and deserialization - * operations.
  • - *
  • MapLite fully supports the GemFire query service.
  • - *
  • MapLite is fully integrated with the key class versioning mechanism, - * which enables multiple versions of MapLite key sets to coexist in the fabric. - * All versioned key classes are fully forward and backward compatible.
  • - *
  • MapLite key classes are universally unique across space and time, - * eradicating the class ID requirement.
  • - *
  • MapLite is natively integrated with the GemFire command line tool, gfsh.
  • - *
  • MapLite is language neutral.
  • - *
- *

- *

Lighter and Faster

- * MapLite, in general, is significantly lighter than HashMap in terms of both - * size and speed. The size of a typical serialized MapLite object is - * considerably smaller than the counterpart HashMap object. Enum - * {@link #get(KeyType)} calls are faster than - * {@link HashMap#get(Object)} because the values are indexed in an - * array, circumventing the more expensive hash lookup operation. - * - *

Map with enum KeyType Keys

- * MapLite implements Map and therefore has the same Map methods and behaves - * exactly like Map. Unlike HashMap which also implements Map, a MapLite object - * is restricted to a fixed set of predefined keys in an enum class that - * implements the interface KeyType. This restriction effectively makes MapLite - * lighter, faster, and more acquiescent than HashMap. It removes the keys from - * the wire format and provides a valid key list for strict allowed key and type - * checking. - * - *

Code Generator

- * Editing keys, although it can be done manually, is done via the provided IDE - * plug-in which automatically generates a new version of the enum class. The - * built-in versioning mechanism allows the new versioned enum class to be - * deployed to the servers and clients during runtime without the requirement of - * restarting them. The servers automatically load the new versioned class - * making it immediately available to the application along with the previous - * versions. - * - *

String Keys

- * In addition to the enum keys, MapLite also supports String keys. String keys - * are costlier than enum keys but comparable to HashMap in terms of the put and - * get speeds. One of the benefits of using String keys is the flexibility of - * executing ad hoc queries. MapLite is fully compliant with the GemFire query - * service, making it ideal for object-relational mapping. - * - *

- *

Using MapLite

- *
    - *
  1. - * Create a {@link KeyType} enum class using the code generator or - * the provided example template.
  2. - *
  3. - * Register the new KeyType enum class using - * {@link KeyTypeManager}.
  4. - *
  5. - * Use KeyType to create MapLite objects. Always use - * {@link #MapLite(KeyType)} to create MapLite objects.
  6. - *
  7. - * Put the MapLite objects into cache regions
  8. - *
  9. - * Get the MapLite objects from cache regions
  10. - *
  11. - * Get values from the objects using KeyType or String - * keys
  12. - *
- * - *

Examples

- * - *
- * import com.gemstone.gemfire.internal.tools.gfsh.pogo.KeyTypeManager;
- * import com.gemstone.gemfire.internal.tools.gfsh.pogo.MapLite;
- * import gemfire.examples.model.Dummy;
- * import gemfre.examples.model.pogo.Dummy_v1;
- * import gemfire.examples.model.pogo.Dummy_v2;
- * 
- * . . .
- *  
- * // Register the Dummy key type. This also registers
- * // all of the versions in the sub-package pogo. This registration
- * // call is not is not required if the registration plug-in
- * // is included in the GemFire cache.xml file.
- * KeyTypeManager.registerKeyType(Dummy.getKeyType());
- * 
- * // Create a MapLite object using the latest Dummy version.
- * // Dummy is equivalent to Dummy_v2 assuming that Dummy_v2 is the
- * // latest version.
- * MapLite ml = new MapLite(Dummy.getKeyType());
- * 
- * // put data using the Dummy.Message enum constant
- * ml.put(Dummy.Message, "Hello, world.");
- * 
- * // put data using the string key "Dummy" which is equivalent to
- * // Dummy.Message
- * ml.put("Message", "Hello, world.");
- * 
- * // Get the value using the Dummy.Message enum constant
- * String message = (String) ml.get(Dummy.Message);
- * 
- * // Get the value using the versioned enum class Dummy_v2 which is
- * // equivalent to Dummy assuming Dummy_v2 is the latest version.
- * message = (String) ml.get(Dummy_v2.Message);
- * 
- * // Get the value using the previous versioned class Dummy_v1 which
- * // may or may not work depending on the changes made to version 2.
- * // If the Message key type has been changed then the type cast will
- * // fail.
- * message = (String) ml.get(Dummy_v1.Message);
- * 
- * // Get the value using the string key "Message".
- * message = (String) ml.get("Message");
- * 
- * - * @author dpark - * - */ -public class MapLite implements DataSerializable, Delta, Map, Cloneable -{ - private static final long serialVersionUID = 1L; - - private static final int BIT_MASK_SIZE = 32; // int type - - private KeyType keyType; - private Object[] values; - private int keyVersion; - private int[] dirtyFlags; - private byte flags; - - // serialized values - private byte[] serializedBytes; - - /** - * The use of this constructor is strongly - * discouraged. Always use {@link #MapLite(KeyType)} wherever - * possible. - *

- * The default constructor creates a new MapLite object with KeyType - * undefined. Undefined KeyType may lead to undesired effects. The following - * restriction applies when using this constructor: - * - *

{@link #put(KeyType, Object)} or {@link #get(KeyType)} - * must be invoked once with a {@link KeyType} enum constant before the - * MapLite object can be used. These methods implicitly initialize the - * MapLite object with the specified key type. MapLite ignores String keys - * until the key type has been assigned.
- * - * An exception to the above restriction is {@link #putAll(Map)} with the - * argument type of MapLite. If MapLite is passed in, then putAll() - * transforms this empty MapLite object into the passed-in MapLite - * key type. - *

- * It is recommended that the overloaded constructor - * {@link #MapLite(KeyType)} should always be used wherever possible. This - * default constructor is primarily for satisfying Java serialization - * restrictions in addition to handling special operations such as putAll(). - * - */ - public MapLite() - { - } - - /** - * Creates a new MapLite object with the specified key type. Once created, - * all subsequent operations must use the same KeyType enum - * class. The key type is obtained from the no-arg static method, - * getKeyType(), included in the generated key type class. For - * example, - * - *

-	 * MapLite ml = new MapLite(Dummy.getKeyType());
-	 * 
- * - * @param keyType - * The key type enum constant to assign to MapLite. - */ - public MapLite(KeyType keyType) - { - init(keyType); - } - - /** - * Initializes the MapLite object by creating data structures for the - * specified key type. - * - * @param keyType - * The key type enum constant to assign to MapLite. - */ - private void init(KeyType keyType) - { - if (keyType == null) { - return; - } - this.keyType = keyType; - this.keyVersion = keyType.getVersion(); - int count = keyType.getKeyCount(); - this.values = new Object[count]; - int dirtyFlagCount = calculateDirtyFlagCount(); - this.dirtyFlags = new int[dirtyFlagCount]; - - if (KeyTypeManager.isRegistered(keyType) == false) { - KeyTypeManager.registerKeyType(keyType); - } - } - - /** - * Calculates the dirty flag count. The dirty flags are kept in an array of - * integers. Each integer value represents 32 dirty flags. - * - * @return Returns the dirty flag count. - */ - private int calculateDirtyFlagCount() - { - int count = keyType.getKeyCount(); - int dirtyFlagCount = count / BIT_MASK_SIZE; - int reminder = count % BIT_MASK_SIZE; - if (reminder > 0) { - dirtyFlagCount++; - } - return dirtyFlagCount; - } - - /** - * Marks all keys dirty. - */ - private void dirtyAllKeys() - { - if (dirtyFlags != null) { - for (int i = 0; i < dirtyFlags.length; i++) { - dirtyFlags[i] = 0xFFFFFFFF; - } - } - } - - /** - * Clears the entire dirty flags. - */ - private void clearDirty() - { - if (dirtyFlags != null) { - for (int i = 0; i < dirtyFlags.length; i++) { - dirtyFlags[i] = 0x0; - } - } - } - - /** - * Returns the key type constant used to initialize this object. - */ - public KeyType getKeyType() - { - return keyType; - } - - /** - * Returns the value of the specified key type. If the default constructor - * {@link #MapLite()} is used to create this object then this method - * implicitly initializes itself with the specified key type if it has not - * been initialized previously. - * - * @param keyType - * The key type constant to lookup the mapped value. - * @return Returns the mapped value. It returns null if the value does not - * exist or it was explicitly set to null. - */ - public V get(KeyType keyType) - { - if (keyType == null) { - return null; - } - - // Initialization is not thread safe. - // It allows the use of the default constructor but at - // the expense of the lack of thread safety. - if (values == null && keyType != null) { - init(keyType); - } - - return (V) values[keyType.getIndex()]; - } - - /** - * Puts the specified value mapped by the specified key type into this - * object. If the default constructor {@link #MapLite()} is used to create - * this object then this method implicitly initializes itself with the - * specified key type if it has not been initialized previously. - *

- * Note that for MapLite to be language neutral, the value type must - * be a valid POGO type. It must be strictly enforced by the application. - * For Java only applications, any Serializable objects are valid. - * - * @param keyType - * The key type constant to lookup the mapped value. - * @param value - * The value to put into the MapLite object. - * @return Returns the old value. It returns null if the old value does not - * exist or has been explicitly set to null. - * @throws InvalidKeyException - * A runtime exception thrown if the passed in value type does - * not match the key type. - */ - public V put(KeyType keyType, V value) throws InvalidKeyException - { - if (keyType == null) { - return null; - } - - // Initialization is not thread safe. - // It allows the use of the default constructor but at - // the expense of the lack of thread safety. - if (values == null) { - init(keyType); - } - - V oldVal = (V) values[keyType.getIndex()]; - values[keyType.getIndex()] = value; - - setDirty(keyType, dirtyFlags); - return oldVal; - } - - /** - * Returns the mapped value for the specified key. It uses the String value - * of the key, i.e., key.toString(), to lookup the mapped value. - * - * @param key - * The key object. - */ - public V get(Object key) - { - if (keyType == null || key == null) { - return null; - } - deserialize(); - KeyType keyType = this.keyType.getKeyType(key.toString()); - if (keyType == null) { - return null; - } - return get(keyType); - } - - /** - * Puts the specified value mapped by the specified key into this object. - * Unlike {@link #put(KeyType, Object)}, this method will not implicitly - * initialize this object if the default constructor is used. If this object - * has not bee initialized, then it throws a runtime exception - * InvalidKeyException. - * - * @param key - * The key object. - * @param value - * The value to put into the MapLite object. - * @return Returns the old value. - */ - public V put(String key, V value) throws InvalidKeyException - { - if (keyType == null) { - if (value == null) { - throw new InvalidKeyException("KeyType undefined due to the use of the MapLite default constructor. " - + "Use MapLite(KeyType) to register the key type."); - } else { - throw new InvalidKeyException("Invalid " + value.getClass().getName() - + ". KeyType undefined due to the use of the default constructor."); - } - } - deserialize(); - KeyType keyType = this.keyType.getKeyType(key.toString()); - if (keyType == null) { - return null; - } - return put(keyType, value); - } - - /** - * Returns true if GemFire delta propagation is enabled and there are - * changes in values. - */ - public boolean hasDelta() - { - if (keyType.isDeltaEnabled()) { - return isDirty(); - } - return false; - } - - /** - * Returns true if there are changes made in values. - */ - public boolean isDirty() - { - for (int i = 0; i < dirtyFlags.length; i++) { - if ((dirtyFlags[i] & 0xFFFFFFFF) != 0) { - return true; - } - } - return false; - } - - /** - * Sets the specified key type dirty. - * - * @param keyType - * The key type to set dirty. - * @param flags - * The flags that contain the key type. - */ - private void setDirty(KeyType keyType, int flags[]) - { - int index = keyType.getIndex(); - setDirty(index, flags); - } - - /** - * Sets the specified contiguous bit of the flags. A contiguous bit is the - * bit number of the contiguous array integers. For example, if the flags - * array size is 2 then the contiguous bit of 32 represents the first bit of - * the flags[1] integer, 33 represents the second bit, and etc. - * - * @param contiguousBit - * The contiguous bit position. - * @param flags - * The bit flags. - */ - private void setDirty(int contiguousBit, int flags[]) - { - int dirtyFlagsIndex = contiguousBit / BIT_MASK_SIZE; - int bit = contiguousBit % BIT_MASK_SIZE; - flags[dirtyFlagsIndex] |= 1 << bit; - } - - /** - * Returns true if the specified key type is dirty. - * - * @param keyType - * The key type to check. - * @param flags - * The flags that contain the key type. - */ -//FindBugs - private method never called -// private boolean isBitDirty(KeyType keyType, int flags[]) -// { -// int index = keyType.getIndex(); -// int dirtyFlagsIndex = index / BIT_MASK_SIZE; -// int bit = index % BIT_MASK_SIZE; -// return isBitDirty(flags[dirtyFlagsIndex], bit); -// } - - /** - * Returns true if the specified contiguous bit of the flags is set. A - * contiguous bit the bit number of the contiguous array integers. For - * example, if the flags array size is 2 then the contiguous bit of 32 - * represents the first bit of the flags[1] integer, 33 represents the - * second bit, and etc. - * - * @param contiguousBit - * The contiguous bit position - * @param flags - * The bit flags - */ -//FindBugs - private method never called -// private boolean isDirty(int contiguousBit, int flags[]) -// { -// int dirtyFlagsIndex = contiguousBit / BIT_MASK_SIZE; -// int bit = contiguousBit % BIT_MASK_SIZE; -// return isBitDirty(flags[dirtyFlagsIndex], bit); -// } - - /** - * Returns true if the specified flag bit id dirty. - * - * @param flag - * The flag to check. - * @param bit - * The bit to compare. - * @return true if the specified flag bit id dirty. - */ - private boolean isBitDirty(int flag, int bit) - { - return ((flag >> bit) & 1) == 1; - } - - /** - * Returns true if the any of the flag bits is dirty. - * - * @param flag - * The flag to check. - */ - private boolean isDirty(int flag) - { - return (flag & 0xFFFFFFFF) != 0; - } - - /** - * Deserializes (inflates) the serialized bytes if has not been done. - */ - private void deserialize() - { - byte[] byteArray = serializedBytes; - if (byteArray != null) { - KeyType[] keyTypeValues = keyType.getValues(keyVersion); - ByteArrayInputStream bais = new ByteArrayInputStream(byteArray); - DataInputStream dis = new DataInputStream(bais); - try { - for (int i = 0; i < keyTypeValues.length; i++) { - if (keyTypeValues[i].isKeyKeepSerialized()) { - // deserialized values - values[i] = readValue(keyTypeValues, i, dis); - } - } - dis.close(); - serializedBytes = null; - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - /** - * Reads the value at for the specified key type index. - * - * @param keyTypes - * The entire key types that represent the MapLite values. - * @param index - * The index of the key to read. - * @param input - * The input stream. - * @return Returns the read value. - * @throws IOException - * Thrown if an IO error encountered. - * @throws ClassNotFoundException - */ - private Object readValue(KeyType[] keyTypes, int index, DataInput input) throws IOException, ClassNotFoundException - { - return MapLiteSerializer.read(keyTypes[index].getType(), input); - } - - /** - * Reads MapLite contents in the specified input stream. - * - * @param input - * The input stream. - * @throws IOException - * Thrown if an IO error encountered. - * @throws ClassNotFoundException - * Thrown if the input stream contains the wrong class type. - * This should never occur with MapLite. - */ - public void fromData(DataInput input) throws IOException, ClassNotFoundException - { - flags = MapLiteSerializer.readByte(input); - long mostSigBits = input.readLong(); - long leastSigBits = input.readLong(); - keyVersion = DataSerializer.readUnsignedShort(input); - keyType = KeyTypeManager.getKeyType(mostSigBits, leastSigBits, keyVersion); - init(keyType); - values = new Object[keyType.getKeyCount()]; - KeyType[] keyTypeValues = keyType.getValues(keyVersion); - if (keyType.isPayloadKeepSerialized()) { - // need not to lock since fromData is invoked only - // once by GemFire - serializedBytes = DataSerializer.readByteArray(input); - byte[] deserializedBytes = DataSerializer.readByteArray(input); - ByteArrayInputStream bais = new ByteArrayInputStream(deserializedBytes); - DataInputStream dis = new DataInputStream(bais); - for (int i = 0; i < keyTypeValues.length; i++) { - if (keyTypeValues[i].isKeyKeepSerialized() == false) { - // deserialized values - values[i] = readValue(keyTypeValues, i, dis); - } - } - dis.close(); - } else { - for (int i = 0; i < keyTypeValues.length; i++) { - values[i] = readValue(keyTypeValues, i, input); - } - } - } - - /** - * Writes the value of the specified index to the output stream. - * - * @param keyTypes - * The entire key types that represent the MapLite values. - * @param index - * The index of the key to write. - * @param output - * The output stream. - * @throws IOException - * Thrown if an IO error encountered. - */ - private void writeValue(KeyType[] keyTypes, int index, DataOutput output) throws IOException - { - try { - MapLiteSerializer.write(keyTypes[index].getType(), values[index], output); - } catch (Exception ex) { - throw new InvalidKeyException(ex.getMessage() + keyTypes.getClass() + " index=" + keyTypes[index].getName(), ex); - } - } - - /** - * Writes the MapLite contents to the specified output stream. - * - * @param output - * The output stream. - * @throws IOException - * Thrown if an IO error encountered. - */ - public void toData(DataOutput output) throws IOException - { - MapLiteSerializer.writeByte(flags, output); - output.writeLong(((UUID) keyType.getId()).getMostSignificantBits()); - output.writeLong(((UUID) keyType.getId()).getLeastSignificantBits()); - DataSerializer.writeUnsignedShort(keyType.getVersion(), output); - KeyType[] keyTypeValues = keyType.getValues(keyVersion); - if (keyType.isPayloadKeepSerialized()) { - // assign byteArray to serializedBytes beforehand to - // handle race condition - byte[] byteArray = serializedBytes; - if (byteArray != null) { - DataSerializer.writeByteArray(byteArray, output); - HeapDataOutputStream hdos2 = new HeapDataOutputStream(Version.CURRENT); - for (int i = 0; i < keyTypeValues.length; i++) { - if (keyTypeValues[i].isKeyKeepSerialized() == false) { - // keep it separate in deserialized array. - // this array is always deserialized - writeValue(keyTypeValues, i, hdos2); - } - } - DataSerializer.writeByteArray(hdos2.toByteArray(), output); - hdos2.close(); - } else { - HeapDataOutputStream hdos = new HeapDataOutputStream(Version.CURRENT); - HeapDataOutputStream hdos2 = new HeapDataOutputStream(Version.CURRENT); - for (int i = 0; i < keyTypeValues.length; i++) { - if (keyTypeValues[i].isKeyKeepSerialized()) { - // serialize in the normal array - // the normal array is deserialized only when the - // one of its keys is accessed. - writeValue(keyTypeValues, i, hdos); - } else { - // keep it separate in deserialized array. - // this array is always deserialized - writeValue(keyTypeValues, i, hdos2); - } - } - DataSerializer.writeByteArray(hdos.toByteArray(), output); - DataSerializer.writeByteArray(hdos2.toByteArray(), output); - hdos.close(); - hdos2.close(); - } - } else { - for (int i = 0; i < keyTypeValues.length; i++) { - writeValue(keyTypeValues, i, output); - } - } - clearDirty(); - } - - /** - * Reads deltas from the specified input stream. - * - * @param input - * The input stream. - * @throws IOException - * Thrown if an IO error encountered. - * @throws InvalidDeltaException - * Thrown if the received deltas cannot be properly applied. - */ - public void fromDelta(DataInput input) throws IOException, InvalidDeltaException - { - KeyType[] keyTypeValues = keyType.getValues(); - int bitCount = keyTypeValues.length; - int dirtyFlagCount = dirtyFlags.length; - - int dirtyFlagsToApply[] = new int[dirtyFlagCount]; - for (int i = 0; i < dirtyFlagCount; i++) { - dirtyFlagsToApply[i] = input.readInt(); - // CacheFactory.getAnyInstance().getLogger().info("dirty = " + - // dirtyFlagsToApply[i]); - } - - try { - int count = BIT_MASK_SIZE; // int - for (int i = 0; i < dirtyFlagsToApply.length; i++) { - int dirty = dirtyFlagsToApply[i]; // received dirty - int userDirty = dirtyFlags[i]; // app dirty - if (i == dirtyFlagsToApply.length - 1) { - count = bitCount % BIT_MASK_SIZE; - if (count == 0 && bitCount != 0) { - count = BIT_MASK_SIZE; - } - } - - // Compare both the current bit and the received bit. - // The app might be modifying the object. If so, keep the - // user modified data and discard the change received. - int startIndex = i * BIT_MASK_SIZE; - for (int j = 0; j < count; j++) { - if (isBitDirty(dirty, j)) { - int index = startIndex + j; - Object value = MapLiteSerializer.readObject(input); - // Set the new value only if the app has not set the - // value - if (isBitDirty(userDirty, j) == false) { - values[index] = value; - } - // CacheFactory.getAnyInstance().getLogger().info("bit set = " - // + j + ", index = " + index); - } - } - } - } catch (ClassNotFoundException ex) { - // ignore - } - } - - /** - * Writes deltas to the specified output stream. - * - * @param output - * The output stream. - * @throws IOException - * Thrown if an IO error encountered. - */ - public void toDelta(DataOutput output) throws IOException - { - KeyType[] keyTypeValues = keyType.getValues(); - int bitCount = keyTypeValues.length; - - for (int i = 0; i < dirtyFlags.length; i++) { - output.writeInt(dirtyFlags[i]); - // System.out.println("dirty = " + dirtyFlags[i]); - } - - int count = BIT_MASK_SIZE; - - for (int i = 0; i < dirtyFlags.length; i++) { - int dirty = dirtyFlags[i]; - if (isDirty(dirty) == false) { - continue; - } - if (i == dirtyFlags.length - 1) { - count = bitCount % BIT_MASK_SIZE; - if (count == 0 && bitCount != 0) { - count = BIT_MASK_SIZE; - } - } - int startIndex = i * BIT_MASK_SIZE; - for (int j = 0; j < count; j++) { - if (isBitDirty(dirty, j)) { - int index = startIndex + j; - MapLiteSerializer.writeObject(values[index], output); - } - } - } - clearDirty(); - } - - /** - * Returns the key type ID that is universally unique. This call is - * equivalent to getKeyType().getId(). - */ - public Object getId() - { - if (keyType == null) { - return null; - } - return keyType.getId(); - } - - /** - * Returns the key type version. There are one or more key type versions per - * ID. This method call is equivalent to invoking - * getKeyType().getVersion(). - */ - public int getKeyTypeVersion() - { - if (keyType == null) { - return 0; - } - return keyType.getVersion(); - } - - /** - * Returns the simple (short) class name of the key type. It returns null if - * the key type is not defined. - */ - public String getName() - { - if (keyType == null) { - return null; - } - return (String) keyType.getClass().getSimpleName(); - } - - /** - * Returns the fully qualified class name of the key type. It returns null - * if the key type is not defined. - */ - public String getKeyTypeName() - { - if (keyType == null) { - return null; - } - return (String) keyType.getClass().getSimpleName(); - } - - /** - * Returns all of the keys that map non-null values. It returns an empty set - * if this object has not been initialized, i.e., KeyType is undefined. - */ - public Set keySet() - { - TreeSet retSet = new TreeSet(); - if (keyType != null) { - - Set set = (Set) keyType.getNameSet(); - for (String key : set) { - if (get(key) != null) { - retSet.add(key); - } - } - } - return retSet; - } - - /** - * Returns the entire collection of non-null values. - */ - public Collection values() - { - ArrayList list = new ArrayList(values.length + 1); - for (int i = 0; i < values.length; i++) { - if (values[i] != null) { - list.add(values[i]); - } - } - return Collections.unmodifiableCollection(list); - } - - /** - * Returns the (string key, value) paired entry set that contains only - * non-null values. - */ - public Set> entrySet() - { - if (keyType == null) { - return null; - } - HashMap map = new HashMap(keyType.getKeyCount() + 1, 1f); - for (KeyType ft : keyType.getValues()) { - Object value = get(ft); - if (value != null) { - map.put((String) ft.getName(), get(ft)); - } - } - return Collections.unmodifiableMap(map).entrySet(); - } - - /** - * Clears the MapLite values. All non-null values are set to null and dirty. - */ - public void clear() - { - if (values != null) { - for (int i = 0; i < values.length; i++) { - if (values[i] != null) { - setDirty(i, dirtyFlags); - } - } - values = new Object[values.length]; - } - } - - /** - * Returns true if the specified key maps a non-null value. It uses - * key.toString() to search the key. - * - * @param key - * The key to check. - */ - public boolean containsKey(Object key) - { - if (keyType == null) { - return false; - } - return get(key) != null; - } - - /** - * Returns true if the specified value exists in this object. It returns - * null if the specified value is null and the MapLite object contains one - * or more null values. - * - * @param value - * The value to search. - */ - public boolean containsValue(Object value) - { - if (keyType == null) { - return false; - } - for (int i = 0; i < values.length; i++) { - if (values[i] == value) { - return true; - } - } - return false; - } - - /** - * Returns true if there are no values stored in this object. A null value - * is considered no value. - */ - public boolean isEmpty() - { - if (keyType == null || values == null) { - return true; - } - for (int i = 0; i < values.length; i++) { - if (values[i] != null) { - return false; - } - } - return false; - } - - /** - * Puts all entries found in the specified map into this MapLite object. The - * specified map is handled based on its type as follows: - * - *

    - *
  • If the specified map is null then it is ignored.
  • - * - *
  • If the specified map is MapLite and this object has not assigned - * KeyType then this method shallow-copies the entire map image into this - * object. As a result, MapLite object effectively becomes a clone of the - * specified map with all of the keys marked dirty.
  • - * - *
  • If the specified map is MapLite and this object has the same KeyType - * as the map then the above bullet also applies.
  • - * - *
  • If the specified map is Map or MapLite with a KeyType that is - * different from this object then this method shallow-copies only the valid - * keys and values. All invalid keys and values are ignored. The valid keys - * must have the same key names defined in this object's KeyType. Similarly, - * the valid values must have the same types defined in this object's - * KeyType. All valid keys are marked dirty.
  • - *
- *

- * Note that the last bullet transforms any Map objects into MapLite - * objects. - * - * @param map - * Mappings to be stored in this MapLite object. If it is null - * then it is silently ignored. - */ - public void putAll(Map map) - { - if (map == null) { - return; - } - - // if key type is not defined - if (keyType == null) { - if (map instanceof MapLite) { - MapLite ml = (MapLite) map; - if (ml.getKeyType() == null) { - return; - } - init(ml.getKeyType()); - System.arraycopy(ml.values, 0, values, 0, values.length); - dirtyAllKeys(); - return; - } else { - return; - } - } - - // if key type is defined - if (map instanceof MapLite) { - MapLite ml = (MapLite) map; - if (keyType == ml.getKeyType()) { - System.arraycopy(ml.values, 0, values, 0, values.length); - dirtyAllKeys(); - return; - } - } - - // If Map or MapLite with a different KeyType - key must be string - Set> set = map.entrySet(); - for (Map.Entry entry : set) { - KeyType keyType = this.keyType.getKeyType(entry.getKey()); - if (keyType == null) { - continue; - } - if (entry.getValue() != null && keyType.getType() != entry.getValue().getClass()) { - continue; - } - put(keyType, entry.getValue()); - } - } - - /** - * Removes the specified key's value. This method removes only the value - * that the key maps to. The keys are never removed. - * - * @param key - * The key of the value to remove. - */ - public V remove(Object key) - { - if (keyType == null || key == null) { - return null; - } - - KeyType keyType = this.keyType.getKeyType(key.toString()); - if (keyType == null) { - return null; - } - - V oldVal = (V) values[keyType.getIndex()]; - - if (oldVal != null) { - // if (this.keyType.isDeltaEnabled()) { - setDirty(keyType, dirtyFlags); - // } - } - // TODO: take care of initial values for primitives - values[keyType.getIndex()] = null; - return oldVal; - } - - /** - * Returns the count of the non-null values. - */ - public int size() - { - if (keyType == null) { - return 0; - } - int count = 0; - for (int i = 0; i < values.length; i++) { - if (values[i] != null) { - count++; - } - } - return count; - } - - /** - * Returns the count of all keys defined by the key type. This method call - * is equivalent to invoking - * {@link #getKeyType()}.getKeyCount(). It returns 0 if MapLite - * is not initialized, i.e., key type is not defined. - */ - public int getKeyCount() - { - if (keyType == null) { - return 0; - } - return keyType.getKeyCount(); - } - - /** - * Clones this object by shallow-copying values. The returned object is the - * exact image of this object including deltas and serialized values. - */ - public Object clone() - { - if (keyType == null) { - return new MapLite(); - } - MapLite ml = new MapLite(keyType); - System.arraycopy(values, 0, ml.values, 0, values.length); - System.arraycopy(dirtyFlags, 0, ml.dirtyFlags, 0, dirtyFlags.length); - if (serializedBytes != null) { - System.arraycopy(serializedBytes, 0, ml.serializedBytes, 0, serializedBytes.length); - } - return ml; - } -}