You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2015/08/27 01:20:50 UTC
[04/12] incubator-geode git commit: Remove old gfsh code
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/2e4f2e6b/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<String, Object> 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<String, Object> prInfoMap = new HashMap<String, Object>();
- 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/2e4f2e6b/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/2e4f2e6b/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/2e4f2e6b/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/2e4f2e6b/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;
-
-
-/**
- * <p>Title:</p>
- * <p>Description: </p>
- * <p>Copyright: Copyright (c) 2004</p>
- * <p>Company: GemStone Systems, Inc.</p>
- * @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/2e4f2e6b/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<String, Method>
- * @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/2e4f2e6b/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/2e4f2e6b/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.
- * <p>
- * Once all of the date-versioned jar files are added, it then proceed
- * to add the rest of the jar files in sorted order.
- * <p>
- * 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<String> 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<File> datedFiles = new ArrayList();
- ArrayList<File> 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<File> 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/2e4f2e6b/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 <code>InvalidKeyException</code> with the specified
- * message.
- */
- public InvalidKeyException(String message)
- {
- super(message);
- }
-
- /**
- * Creates a new <code>InvalidKeyException</code> 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/2e4f2e6b/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<String> 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/2e4f2e6b/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<UUID, Map<Integer, KeyType>> uuidMap = new ConcurrentHashMap<UUID, Map<Integer, KeyType>>();
-
- /**
- * 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<Integer, KeyType> map = uuidMap.get(keyType.getId());
- if (map == null) {
- map = new TreeMap<Integer, KeyType>();
- 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<Integer, KeyType> 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<Integer, KeyType> 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/2e4f2e6b/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.
- * <p>
- * 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.
- * <p>
- * <ul>
- * <li>MapLite is fully POGO compliant.</li>
- * <li>MapLite implements {@link java.util.Map}.</li>
- * <li>MapLite and POGO are in general significantly lighter than POJO and
- * {@link HashMap}. Its wire format is compact and does not require class
- * reflection.</li>
- * <li>MapLite and POGO are faster than POJO and HashMap. Its smaller payload
- * size means it is serialized and delivered faster.</li>
- * <li>MapLite lookup is faster than HashMap. MapLite keeps values internally
- * indexed in an array for faster access.</li>
- * <li>MapLite fully supports GemFire delta propagation.
- * <li>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.</li>
- * <li>MapLite fully supports the GemFire query service.</li>
- * <li>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.</li>
- * <li>MapLite key classes are universally unique across space and time,
- * eradicating the class ID requirement.</li>
- * <li>MapLite is natively integrated with the GemFire command line tool, gfsh.</li>
- * <li>MapLite is language neutral.</li>
- * </ul>
- * <p>
- * <h3>Lighter and Faster</h3>
- * 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.
- *
- * <h3>Map with enum KeyType Keys</h3>
- * 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.
- *
- * <h3>Code Generator</h3>
- * 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.
- *
- * <h3>String Keys</h3>
- * 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.
- *
- * <p>
- * <h3>Using MapLite</h3>
- * <ol>
- * <li>
- * Create a <code>{@link KeyType}</code> enum class using the code generator or
- * the provided example template.</li>
- * <li>
- * Register the new <code>KeyType</code> enum class using
- * <code>{@link KeyTypeManager}</code>.</li>
- * <li>
- * Use <code>KeyType</code> to create <code>MapLite</code> objects. Always use
- * {@link #MapLite(KeyType)} to create <code>MapLite</code> objects.</li>
- * <li>
- * Put the MapLite objects into cache regions</li>
- * <li>
- * Get the MapLite objects from cache regions</li>
- * <li>
- * Get values from the objects using <code>KeyType</code> or <code>String</code>
- * keys</li>
- * </ol>
- *
- * <h3>Examples</h3>
- *
- * <pre>
- * 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");
- * </pre>
- *
- * @author dpark
- *
- */
-public class MapLite<V> implements DataSerializable, Delta, Map<String, V>, 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;
-
- /**
- * <font COLOR="#ff0000"><strong>The use of this constructor is strongly
- * discouraged. Always use {@link #MapLite(KeyType)} wherever
- * possible.</strong></font>
- * <p>
- * 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:
- *
- * <blockquote><i> {@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. </i></blockquote>
- *
- * 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 <i>empty</i> MapLite object into the passed-in MapLite
- * key type.
- * <p>
- * 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 <code>KeyType</code> enum
- * class. The key type is obtained from the <i>no-arg</i> static method,
- * <code>getKeyType()</code>, included in the generated key type class. For
- * example,
- *
- * <pre>
- * MapLite ml = new MapLite(Dummy.getKeyType());
- * </pre>
- *
- * @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.
- * <p>
- * 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 <code>getKeyType().getId()</code>.
- */
- 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
- * <code>getKeyType().getVersion()</code>.
- */
- 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<String> keySet()
- {
- TreeSet<String> retSet = new TreeSet<String>();
- if (keyType != null) {
-
- Set<String> set = (Set<String>) 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<V> 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<Map.Entry<String, V>> entrySet()
- {
- if (keyType == null) {
- return null;
- }
- HashMap<String, V> 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:
- *
- * <ul>
- * <li>If the specified map is null then it is ignored.</li>
- *
- * <li>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.</li>
- *
- * <li>If the specified map is MapLite and this object has the same KeyType
- * as the map then the above bullet also applies.</li>
- *
- * <li>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.</li>
- * </ul>
- * <p>
- * 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<? extends String, ? extends V> 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<? extends Map.Entry<? extends String, ? extends V>> set = map.entrySet();
- for (Map.Entry<? extends String, ? extends V> 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
- * <code>{@link #getKeyType()}.getKeyCount()</code>. 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;
- }
-}