You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by rv...@apache.org on 2015/04/28 23:40:54 UTC

[49/51] [partial] incubator-geode git commit: Init

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-assembly/src/main/dist/bin/gfsh-completion.bash
----------------------------------------------------------------------
diff --git a/gemfire-assembly/src/main/dist/bin/gfsh-completion.bash b/gemfire-assembly/src/main/dist/bin/gfsh-completion.bash
new file mode 100755
index 0000000..6db7ef1
--- /dev/null
+++ b/gemfire-assembly/src/main/dist/bin/gfsh-completion.bash
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+#
+# Auto completion script for GemFire's gfsh script
+#
+# Either explicitly source it into your shell enviroment, set it up in your
+# .bashrc or .bash_profile or copy it to /etc/bash_completion.d
+#
+
+_gfsh() {
+    # The main verbs gfsh understands
+    declare -r VERBS="compact describe encrypt help run start status stop validate version"
+
+    # The nouns relevant to the verbs
+    declare -r N_compact="offline-disk-store"
+    declare -r N_describe="offline-disk-store"
+    declare -r N_encrypt="password"
+    declare -r N_help="$VERBS"
+    declare -r N_start="jconsole jvisualvm locator pulse server vsd"
+    declare -r N_status="locator server"
+    declare -r N_stop="locator server"
+    declare -r N_validate="offline-disk-store"
+
+    # The options relevant to each verb-noun combination
+    declare -r OPT_compact_offline_disk_store="--name --disk-dirs --max-oplog-size --J"
+    declare -r OPT_describe_offline_disk_store="--name=value --disk-dirs --region"
+    declare -r OPT_encrypt_password="--password"
+    declare -r OPT_run="--file --quiet --continue-on-error"
+    declare -r OPT_start_jconsole="--interval --notile --pluginpath --version --J"
+    declare -r OPT_start_jvisualvm="--J"
+    declare -r OPT_start_locator="--name --bind-address --force --group \
+        --hostname-for-clients --locators --log-level --mcast-address \
+        --mcast-port --port --dir --properties-file --security-properties-file \
+        --initial-heap --max-heap --J --connect --enable-cluster-configuration \
+        --load-cluster-configuration-from-dir"
+    declare -r OPT_start_pulse="--url"
+    declare -r OPT_start_server="--name --assign-buckets --bind-address \
+        --cache-xml-file --classpath --disable-default-server \
+        --disable-exit-when-out-of-memory --enable-time-statistics --force \
+        --properties-file --security-properties-file --group \
+        --locators \
+        --log-level --mcast-address --mcast-port --name --memcached-port \
+        --memcached-protocol --rebalance --server-bind-address --server-port \
+        --spring-xml-location --statistic-archive-file --dir --initial-heap \
+        --max-heap --use-cluster-configuration --J --critical-heap-percentage \
+        --eviction-heap-percentage --hostname-for-clients --max-connections \
+        --message-time-to-live --max-message-count --max-threads --socket-buffer-size"
+    declare -r OPT_start_vsd="--file"
+    declare -r OPT_status_locator="--name --host --port --pid --dir"
+    declare -r OPT_status_server="--name --pid --dir"
+    declare -r OPT_stop_locator="--name --pid --dir"
+    declare -r OPT_stop_server="--name --pid --dir"
+    declare -r OPT_validate_offline_disk_store="--name --disk-dirs"
+    declare -r OPT_version="--full"
+
+    local cur=${COMP_WORDS[COMP_CWORD]}
+    local use="VERBS"
+
+    local verb=${COMP_WORDS[1]}
+    local noun=${COMP_WORDS[2]}
+
+    # Ignore potential options
+    noun=${noun##-*}
+
+    # Because variable names can't have dashes
+    noun=${noun//-/_}
+
+    if [[ -n "$noun" ]]; then
+        use="OPT_${verb}_${noun}"
+        if [[ -z "${!use}" ]]; then
+            use="N_$verb"
+        fi
+    elif [[ -n "$verb" ]]; then
+        # Special handling for these as they don't have associated nouns
+        if [[ "$verb" = "run" || "$verb" = "version" ]]; then
+            use="OPT_$verb"
+        else
+            use="N_$verb"
+            if [[ -z "${!use}" ]]; then
+                use="VERBS"
+            fi
+        fi
+    fi
+
+    COMPREPLY=( $( compgen -W "${!use}" -- "$cur" ) )
+}
+
+complete -F _gfsh gfsh
+    

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-assembly/src/main/dist/bin/gfsh.bat
----------------------------------------------------------------------
diff --git a/gemfire-assembly/src/main/dist/bin/gfsh.bat b/gemfire-assembly/src/main/dist/bin/gfsh.bat
new file mode 100755
index 0000000..c4a9480
--- /dev/null
+++ b/gemfire-assembly/src/main/dist/bin/gfsh.bat
@@ -0,0 +1,73 @@
+@echo off
+
+REM
+REM Environment variables:
+REM
+REM GF_JAVA - java executable path. 
+REM
+REM JAVA_ARGS - java arguments, i.e., -Xms1024m -Xmx1024m ... 
+REM
+REM GEMFIRE - GemFire product Directory
+REM
+REM
+
+@setlocal enableextensions
+@set scriptdir=%~dp0
+@set gf=%scriptdir:\bin\=%
+REM echo %gf%
+REM echo %scriptdir%
+@if exist "%gf%\lib\gemfire-core-dependencies.jar" @goto gfok
+@echo Could not determine GEMFIRE location
+@verify other 2>nul
+@goto done
+:gfok
+@set GEMFIRE=%gf%
+
+@set GEMFIRE_JARS=%GEMFIRE%\lib\gfsh-dependencies.jar
+@if defined CLASSPATH (
+@set GEMFIRE_JARS=%GEMFIRE_JARS%;%CLASSPATH%
+)
+
+@if not defined GF_JAVA (
+@REM %GF_JAVA% is not defined, assume it is on the PATH
+@if defined JAVA_HOME (
+@set GF_JAVA=%JAVA_HOME%\bin\java.exe
+) else (
+@set GF_JAVA=java
+)
+) 
+
+REM
+REM GFSH_JARS
+REM
+@set GFSH_JARS=;%GEMFIRE%\lib\gfsh-dependencies.jar
+@set CLASSPATH=%GFSH_JARS%;%GEMFIRE_JARS%
+
+REM
+REM Copy default .gfshrc to the home directory. Uncomment if needed.
+REM
+REM @if not exist "%USERPROFILE%\.gemfire\.gfsh2rc" (
+REM @xcopy /q "%GEMFIRE%\defaultConfigs\.gfsh2rc" "%USERPROFILE%\.gemfire"
+REM )
+
+REM
+REM Make dir if .gemfire does not exist. Uncomment if needed.
+REM
+REM @if not exist "%USERPROFILE%\.gemfire" (
+REM @mkdir "%USERPROFILE%\.gemfire"
+REM )
+
+REM  Consider java is from JDK
+@set TOOLS_JAR=%JAVA_HOME%\lib\tools.jar
+@IF EXIST "%TOOLS_JAR%" (
+    @set CLASSPATH=%CLASSPATH%;%TOOLS_JAR%
+) ELSE (
+    set TOOLS_JAR=
+)
+
+@set LAUNCHER=com.gemstone.gemfire.management.internal.cli.Launcher
+@if defined JAVA_ARGS (
+@set JAVA_ARGS="%JAVA_ARGS%"
+)
+@"%GF_JAVA%" -Dgfsh=true -Dlog4j.configurationFile=/com/gemstone/gemfire/internal/logging/log4j/log4j2-cli.xml %JAVA_ARGS% %LAUNCHER% %*
+:done

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/build.gradle
----------------------------------------------------------------------
diff --git a/gemfire-core/build.gradle b/gemfire-core/build.gradle
new file mode 100755
index 0000000..7639aa4
--- /dev/null
+++ b/gemfire-core/build.gradle
@@ -0,0 +1,133 @@
+sourceSets {
+  jca {
+    compileClasspath += configurations.compile
+    runtimeClasspath += configurations.runtime
+  }
+}
+
+configurations {
+  //declaring new configuration that will be used to associate with artifacts
+  archives
+}
+
+dependencies {
+  provided files("${System.getProperty('java.home')}/../lib/tools.jar")
+  compile 'antlr:antlr:2.7.7'
+  compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.0'
+  compile 'com.fasterxml.jackson.core:jackson-core:2.2.0'
+  compile 'com.fasterxml.jackson.core:jackson-databind:2.2.0'
+  compile 'com.google.code.findbugs:annotations:3.0.0'
+  compile 'commons-io:commons-io:2.3'
+  compile 'commons-logging:commons-logging:1.1.1'
+  compile 'commons-modeler:commons-modeler:2.0'
+  compile 'it.unimi.dsi:fastutil:6.6.2'
+  compile 'javax.activation:activation:1.1.1'
+  compile 'javax.mail:javax.mail-api:1.4.5'
+  compile 'javax.resource:javax.resource-api:1.7'
+  compile 'javax.servlet:javax.servlet-api:3.1.0'
+  compile 'javax.transaction:javax.transaction-api:1.2'
+  compile 'mx4j:mx4j:3.0.1'
+  compile 'mx4j:mx4j-remote:3.0.1'
+  compile 'mx4j:mx4j-tools:3.0.1'
+  compile 'net.java.dev.jna:jna:4.0.0'
+  compile 'net.sourceforge.jline:jline:1.0.S2-B'
+  compile 'org.eclipse.jetty:jetty-http:9.2.3.v20140905'
+  compile 'org.eclipse.jetty:jetty-io:9.2.3.v20140905'
+  compile 'org.eclipse.jetty:jetty-security:9.2.3.v20140905'
+  compile 'org.eclipse.jetty:jetty-server:9.2.3.v20140905'
+  compile 'org.eclipse.jetty:jetty-servlet:9.2.3.v20140905'
+  compile 'org.eclipse.jetty:jetty-util:9.2.3.v20140905'
+  compile 'org.eclipse.jetty:jetty-webapp:9.2.3.v20140905'
+  compile 'org.eclipse.jetty:jetty-xml:9.2.3.v20140905'
+  compile 'org.fusesource.jansi:jansi:1.8'
+  compile 'org.apache.logging.log4j:log4j-api:2.1'
+  compile 'org.apache.logging.log4j:log4j-core:2.1'
+  compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.1'
+  compile 'org.apache.logging.log4j:log4j-jcl:2.1'
+  compile 'org.slf4j:slf4j-api:1.7.7'
+  compile 'org.springframework.data:spring-data-commons:1.9.1.RELEASE'
+  compile 'org.springframework.data:spring-data-gemfire:1.5.1.RELEASE'
+  compile 'org.springframework:spring-tx:3.2.12.RELEASE'
+  compile 'org.springframework.shell:spring-shell:1.0.0.RELEASE'
+  compile 'org.xerial.snappy:snappy-java:1.1.1.6'
+
+  compile project(':gemfire-jgroups')
+  compile project(':gemfire-joptsimple')
+  compile project(':gemfire-json')
+  
+  testCompile 'org.apache.bcel:bcel:5.2'
+
+  jcaCompile sourceSets.main.output
+
+  provided project(path: ':gemfire-junit', configuration: 'testOutput')
+}
+
+// Creates the version properties file and writes it to the classes dir
+task createVersionPropertiesFile << {
+  ext.gitBranch = 'master'
+  ext.commitId = '1366ff2d4fcbf54bfad684e9ba9822db2a2b0ff5'
+  ext.sourceDate = '2015-04-06 14:54:51 -0700'
+  
+  ext.osArch = System.getProperty('os.arch')
+  ext.osName = System.getProperty('os.name')
+  ext.osVersion = System.getProperty('os.version')
+  ext.buildDate = new Date().format('yyyy-MM-dd HH:mm:ss Z')
+  ext.buildNumber = new Date().format('MMddyy')
+  ext.jdkVersion = System.getProperty('java.version')
+
+  def props = [
+    "Product-Name"      : "Pivotal GemFire",
+    "Product-Version"   : version,
+    "Build-Id"          : System.env.USER + ' ' + ext.buildNumber,
+    "Build-Date"        : ext.buildDate,
+    "Build-Platform"    : ext.osName + ' ' + ext.osVersion + ' ' + ext.osArch,
+    "Build-Java-Version": ext.jdkVersion,
+    "Source-Date"       : ext.sourceDate,
+    "Source-Revision"   : ext.commitId,
+    "Source-Repository" : ext.gitBranch
+  ] as Properties
+
+  new FileOutputStream(file("$buildDir/classes/main/com/gemstone/gemfire/internal/GemFireVersion.properties")).withStream { fos ->
+    props.store(fos, '')
+  }
+}
+
+jar {
+
+  from sourceSets.main.output
+  from sourceSets.jca.output
+  
+  exclude 'com/gemstone/gemfire/management/internal/web/**'
+  exclude 'com/gemstone/gemfire/internal/i18n/StringIdResourceBundle_ja.txt'
+  exclude 'com/gemstone/gemfire/admin/doc-files/ds4_0.dtd'
+}
+
+task webJar (type: Jar, dependsOn: classes) {
+  description 'Assembles the jar archive containing the gemfire management web classes.'
+  from sourceSets.main.output
+  baseName 'gemfire-web'
+  include 'com/gemstone/gemfire/management/internal/web/**'
+}
+
+task raJar (type: Jar, dependsOn: classes) {
+  description 'Assembles the jar archive that contains the JCA classes'
+  from sourceSets.jca.output
+  exclude 'com/gemstone/gemfire/ra/**'
+  archiveName 'ra.jar'
+}
+
+task jcaJar (type: Jar, dependsOn: raJar) {
+  description 'Assembles the jar archive that contains the JCA bundle'
+  baseName 'gemfire-jca'
+  extension 'rar'
+  metaInf { from 'src/jca/ra.xml' }
+  from raJar.archivePath
+}
+
+artifacts {
+  archives webJar, raJar, jcaJar
+}
+
+compileJava.doLast {
+    tasks.createVersionPropertiesFile.execute()
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionFactoryImpl.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionFactoryImpl.java b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionFactoryImpl.java
new file mode 100644
index 0000000..0453cf7
--- /dev/null
+++ b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionFactoryImpl.java
@@ -0,0 +1,57 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.ra;
+
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ManagedConnectionFactory;
+
+import com.gemstone.gemfire.ra.GFConnectionFactory;
+/**
+ * 
+ * @author asif
+ *
+ */
+public class GFConnectionFactoryImpl implements GFConnectionFactory
+{
+  final private ConnectionManager cm;
+
+  final private ManagedConnectionFactory mcf;
+
+  private Reference ref;
+
+  public GFConnectionFactoryImpl(ManagedConnectionFactory mcf) {
+    this.cm = null;
+    this.mcf = mcf;
+  }
+
+  public GFConnectionFactoryImpl(ConnectionManager cm,
+      ManagedConnectionFactory mcf) {
+    this.cm = cm;
+    this.mcf = mcf;
+  }
+
+  public GFConnectionImpl getConnection() throws ResourceException
+  {
+    return (GFConnectionImpl)cm.allocateConnection(mcf, null);
+  }
+
+  public void setReference(Reference ref)
+  {
+    this.ref = ref;
+
+  }
+
+  public Reference getReference() throws NamingException
+  {
+    return this.ref;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionImpl.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionImpl.java b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionImpl.java
new file mode 100644
index 0000000..095fe9f
--- /dev/null
+++ b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/GFConnectionImpl.java
@@ -0,0 +1,62 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.ra;
+
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.resource.ResourceException;
+
+import com.gemstone.gemfire.internal.ra.spi.JCAManagedConnection;
+import com.gemstone.gemfire.ra.GFConnection;
+
+/**
+ * 
+ * @author asif
+ *
+ */
+public class GFConnectionImpl implements GFConnection
+{
+  private JCAManagedConnection mc;
+
+  private Reference ref;
+
+  public GFConnectionImpl(JCAManagedConnection mc) {
+    this.mc = mc;
+  }
+
+  public void resetManagedConnection(JCAManagedConnection mc)
+  {
+    this.mc = mc;
+  }
+
+  public void close() throws ResourceException
+  {
+    // Check if the connection is associated with a JTA. If yes, then
+    // we should throw an exception on close being invoked.
+    if (this.mc != null) {
+      this.mc.onClose(this);
+    }
+  }
+
+  public void invalidate()
+  {
+    this.mc = null;
+  }
+
+  public void setReference(Reference ref)
+  {
+    this.ref = ref;
+
+  }
+
+  public Reference getReference() throws NamingException
+  {
+    return this.ref;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCALocalTransaction.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCALocalTransaction.java b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCALocalTransaction.java
new file mode 100644
index 0000000..1d1a61b
--- /dev/null
+++ b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCALocalTransaction.java
@@ -0,0 +1,227 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.ra.spi;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.LocalTransaction;
+import javax.resource.spi.LocalTransactionException;
+import javax.transaction.SystemException;
+import javax.transaction.TransactionManager;
+
+import com.gemstone.gemfire.LogWriter;
+import com.gemstone.gemfire.cache.CacheFactory;
+import com.gemstone.gemfire.cache.TransactionId;
+import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
+import com.gemstone.gemfire.internal.cache.TXStateProxy;
+
+import com.gemstone.gemfire.internal.cache.TXManagerImpl;
+import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
+
+/**
+ * 
+ * @author asif
+ *
+ */
+public class JCALocalTransaction implements LocalTransaction
+{
+  private volatile GemFireCacheImpl cache;
+
+  private volatile TXManagerImpl gfTxMgr;
+
+  private volatile TransactionId tid;
+
+  private static final boolean DEBUG = false;
+
+  private volatile boolean initDone = false;
+
+  JCALocalTransaction(GemFireCacheImpl cache, TXManagerImpl tm) {
+    this.cache = cache;
+    this.gfTxMgr = tm;
+    this.initDone = true;
+    // System.out.println("Asif:JCALocalTransaction:Param contrcutr for tx ="+
+    // this );
+  }
+
+  JCALocalTransaction() {
+    this.cache = null;
+    this.gfTxMgr = null;
+    this.initDone = false;
+    // System.out.println("Asif:JCALocalTransaction:Empty constructor for tx ="+
+    // this );
+  }
+
+  public void begin() throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException("Asif:JCALocalTransaction:begin");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+    try {
+      if (!initDone || this.cache.isClosed()) {
+        this.init();
+      }
+      // System.out.println("JCALocalTransaction:Asif: cache is ="+cache +
+      // " for tx ="+this);
+      LogWriter logger = cache.getLogger();
+      if (logger.fineEnabled()) {
+        logger.fine("JCALocalTransaction::begin:");
+      }
+      TransactionManager tm = cache.getJTATransactionManager();
+      if (this.tid != null) {
+        throw new LocalTransactionException(
+            " A transaction is already in progress");
+      }
+      if (tm != null && tm.getTransaction() != null) {
+        if (logger.fineEnabled()) {
+          logger.fine("JCAManagedConnection: JTA transaction is on");
+        }
+        // This is having a JTA transaction. Assuming ignore jta flag is true,
+        // explicitly being a gemfire transaction.
+        TXStateProxy tsp = this.gfTxMgr.getTXState();
+        if (tsp == null) {
+          this.gfTxMgr.begin();
+          tsp = this.gfTxMgr.getTXState();
+          tsp.setJCATransaction();
+          this.tid = tsp.getTransactionId();
+          if (logger.fineEnabled()) {
+            logger.fine("JCALocalTransaction:begun GFE transaction");
+          }
+        }
+        else {
+          throw new LocalTransactionException(
+              "GemFire is already associated with a transaction");
+        }
+      }
+      else {
+        if (logger.fineEnabled()) {
+          logger.fine("JCAManagedConnection: JTA Transaction does not exist.");
+        }
+      }
+    }
+    catch (SystemException e) {
+      // this.onError();
+      throw new ResourceException(e);
+    }
+    // Not to be invoked for local transactions managed by the container
+    // Iterator<ConnectionEventListener> itr = this.listeners.iterator();
+    // ConnectionEvent ce = new ConnectionEvent(this,
+    // ConnectionEvent.LOCAL_TRANSACTION_STARTED);
+    // while (itr.hasNext()) {
+    // itr.next().localTransactionStarted(ce);
+    // }
+
+  }
+
+  public void commit() throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException("Asif:JCALocalTransaction:commit");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+    LogWriter logger = cache.getLogger();
+    if (logger.fineEnabled()) {
+      logger.fine("JCALocalTransaction:invoked commit");
+    }
+    TXStateProxy tsp = this.gfTxMgr.getTXState();
+    if (tsp != null && this.tid != tsp.getTransactionId()) {
+      throw new IllegalStateException(
+          "Local Transaction associated with Tid = " + this.tid
+              + " attempting to commit a different transaction");
+    }
+    try {
+      this.gfTxMgr.commit();
+      this.tid = null;
+    }
+    catch (Exception e) {
+      throw new LocalTransactionException(e.toString());
+    }
+    // Iterator<ConnectionEventListener> itr = this.listeners.iterator();
+    // ConnectionEvent ce = new
+    // ConnectionEvent(this,ConnectionEvent.LOCAL_TRANSACTION_COMMITTED);
+    // while( itr.hasNext()) {
+    // itr.next().localTransactionCommitted(ce);
+    // }
+
+  }
+
+  public void rollback() throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException("Asif:JJCALocalTransaction:rollback");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+    TXStateProxy tsp = this.gfTxMgr.getTXState();
+    if (tsp != null && this.tid != tsp.getTransactionId()) {
+      throw new IllegalStateException(
+          "Local Transaction associated with Tid = " + this.tid
+              + " attempting to commit a different transaction");
+    }
+    LogWriter logger = cache.getLogger();
+    if (logger.fineEnabled()) {
+      logger.fine("JCALocalTransaction:invoked rollback");
+    }
+    try {
+      this.gfTxMgr.rollback();
+    }
+    catch (IllegalStateException ise) {
+      // It is possible that the GFE transaction has already been rolled back.
+      if (ise
+          .getMessage()
+          .equals(
+              LocalizedStrings.TXManagerImpl_THREAD_DOES_NOT_HAVE_AN_ACTIVE_TRANSACTION
+                  .toLocalizedString())) {
+        // /ignore;
+      }
+      else {
+        throw new ResourceException(ise);
+      }
+    }
+    catch (Exception e) {
+      throw new ResourceException(e);
+    }
+    finally {
+      this.tid = null;
+    }
+    // Iterator<ConnectionEventListener> itr = this.listeners.iterator();
+    // ConnectionEvent ce = new ConnectionEvent(this,
+    // ConnectionEvent.LOCAL_TRANSACTION_ROLLEDBACK);
+    // while (itr.hasNext()) {
+    // itr.next().localTransactionRolledback(ce);
+    // }
+
+  }
+
+  private void init() throws SystemException
+  {
+    this.cache = (GemFireCacheImpl)CacheFactory.getAnyInstance();
+    LogWriter logger = this.cache.getLogger();
+    if (logger.fineEnabled()) {
+      logger.fine("JCAManagedConnection:init. Inside init");
+    }
+    gfTxMgr = cache.getTxManager();
+    this.initDone = true;
+  }
+
+  boolean transactionInProgress()
+  {
+    return this.tid != null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnection.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnection.java b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnection.java
new file mode 100644
index 0000000..9b54c33
--- /dev/null
+++ b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnection.java
@@ -0,0 +1,290 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.ra.spi;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.resource.NotSupportedException;
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionEvent;
+import javax.resource.spi.ConnectionEventListener;
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.resource.spi.LocalTransaction;
+import javax.resource.spi.ManagedConnection;
+import javax.resource.spi.ManagedConnectionMetaData;
+import javax.security.auth.Subject;
+import javax.transaction.SystemException;
+import javax.transaction.xa.XAResource;
+
+import com.gemstone.gemfire.LogWriter;
+import com.gemstone.gemfire.cache.CacheFactory;
+import com.gemstone.gemfire.internal.cache.GemFireCacheImpl;
+import com.gemstone.gemfire.internal.cache.TXManagerImpl;
+import com.gemstone.gemfire.internal.ra.GFConnectionImpl;
+
+/**
+ * 
+ * @author asif
+ *
+ */
+public class JCAManagedConnection implements ManagedConnection
+
+{
+  private final List<ConnectionEventListener> listeners;
+
+  private volatile TXManagerImpl gfTxMgr;
+
+  // private volatile TransactionId currentTxID;
+  private volatile GemFireCacheImpl cache;
+
+  private volatile boolean initDone = false;
+
+  private volatile PrintWriter logger;
+
+  private JCAManagedConnectionFactory factory;
+
+  private volatile Set<GFConnectionImpl> connections;
+
+  private volatile JCALocalTransaction localTran;
+
+  private final static boolean DEBUG = false;
+
+  public JCAManagedConnection(JCAManagedConnectionFactory fact) {
+    this.factory = fact;
+    this.listeners = Collections
+        .<ConnectionEventListener> synchronizedList(new ArrayList<ConnectionEventListener>());
+    this.localTran = new JCALocalTransaction();
+    this.connections = Collections
+        .<GFConnectionImpl> synchronizedSet(new HashSet<GFConnectionImpl>());
+  }
+
+  public void addConnectionEventListener(ConnectionEventListener listener)
+  {
+    this.listeners.add(listener);
+
+  }
+
+  public void associateConnection(Object conn) throws ResourceException
+  {
+    if (!(conn instanceof GFConnectionImpl)) {
+      throw new ResourceException("Connection is not of type GFConnection");
+    }
+
+    ((GFConnectionImpl)conn).resetManagedConnection(this);
+    this.connections.add((GFConnectionImpl)conn);
+  }
+
+  public void cleanup() throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException("Asif:JCAManagedConnection:cleanup");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+    synchronized (this.connections) {
+      Iterator<GFConnectionImpl> connsItr = this.connections.iterator();
+      while (connsItr.hasNext()) {
+        GFConnectionImpl conn = connsItr.next();
+        conn.invalidate();
+        connsItr.remove();
+      }
+    }
+    if (this.localTran == null || this.localTran.transactionInProgress()) {
+      if (this.initDone && !this.cache.isClosed()) {
+        this.localTran = new JCALocalTransaction(cache, gfTxMgr);
+      }
+      else {
+        this.localTran = new JCALocalTransaction();
+      }
+    }
+
+  }
+
+  public void destroy() throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException("Asif:JCAManagedConnection:destroy");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+    synchronized (this.connections) {
+      Iterator<GFConnectionImpl> connsItr = this.connections.iterator();
+      while (connsItr.hasNext()) {
+        GFConnectionImpl conn = connsItr.next();
+        conn.invalidate();
+        connsItr.remove();
+      }
+    }
+    this.gfTxMgr = null;
+    this.cache = null;
+    this.localTran = null;
+    this.listeners.clear();
+  }
+
+  public Object getConnection(Subject arg0, ConnectionRequestInfo arg1)
+      throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException(
+            "Asif:JCAManagedConnection:getConnection");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+    try {
+      if (!this.initDone || this.cache.isClosed()) {
+        init();
+      }
+      LogWriter logger = this.cache.getLogger();
+      if (logger.fineEnabled()) {
+        logger
+            .fine("JCAManagedConnection:getConnection. Returning new Connection");
+      }
+
+      GFConnectionImpl conn = new GFConnectionImpl(this);
+      this.connections.add(conn);
+      return conn;
+    }
+    catch (SystemException e) {
+      this.onError(e);
+      throw new ResourceException("GemFire Resource unavailable", e);
+    }
+  }
+
+  private void init() throws SystemException
+  {
+    this.cache = (GemFireCacheImpl)CacheFactory.getAnyInstance();
+    LogWriter logger = this.cache.getLogger();
+    if (logger.fineEnabled()) {
+      logger.fine("JCAManagedConnection:init. Inside init");
+    }
+    gfTxMgr = cache.getTxManager();
+    this.initDone = true;
+  }
+
+  public LocalTransaction getLocalTransaction() throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException(
+            "Asif:JCAManagedConnection:getLocalTransaction");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+
+    return this.localTran;
+  }
+
+  public PrintWriter getLogWriter() throws ResourceException
+  {
+    return this.logger;
+  }
+
+  public ManagedConnectionMetaData getMetaData() throws ResourceException
+  {
+    if (DEBUG) {
+      try {
+        throw new NullPointerException("Asif:JCAManagedConnection:getMetaData");
+      }
+      catch (NullPointerException npe) {
+        npe.printStackTrace();
+      }
+    }
+    if (this.initDone && !this.cache.isClosed()) {
+      LogWriter logger = this.cache.getLogger();
+      if (logger.fineEnabled()) {
+        logger.fine("JCAManagedConnection:getMetaData");
+      }
+    }
+    return new JCAManagedConnectionMetaData(this.factory.getProductName(),
+        this.factory.getVersion(), this.factory.getUserName());
+  }
+
+  public XAResource getXAResource() throws ResourceException
+  {
+    throw new NotSupportedException("XA Transaction not supported");
+  }
+
+  public void removeConnectionEventListener(ConnectionEventListener arg0)
+  {
+    this.listeners.remove(arg0);
+
+  }
+
+  public void setLogWriter(PrintWriter logger) throws ResourceException
+  {
+    this.logger = logger;
+  }
+
+  private void onError(Exception e)
+  {
+
+    this.localTran = null;
+
+    synchronized (this.connections) {
+      Iterator<GFConnectionImpl> connsItr = this.connections.iterator();
+      while (connsItr.hasNext()) {
+        GFConnectionImpl conn = connsItr.next();
+        conn.invalidate();
+        synchronized (this.listeners) {
+          Iterator<ConnectionEventListener> itr = this.listeners.iterator();
+          ConnectionEvent ce = new ConnectionEvent(this,
+              ConnectionEvent.CONNECTION_ERROR_OCCURRED, e);
+          ce.setConnectionHandle(conn);
+          while (itr.hasNext()) {
+            itr.next().connectionErrorOccurred(ce);
+          }
+        }
+        connsItr.remove();
+      }
+    }
+
+  }
+
+  public void onClose(GFConnectionImpl conn) throws ResourceException
+  {
+    conn.invalidate();
+    this.connections.remove(conn);
+    synchronized (this.listeners) {
+      Iterator<ConnectionEventListener> itr = this.listeners.iterator();
+      ConnectionEvent ce = new ConnectionEvent(this,
+          ConnectionEvent.CONNECTION_CLOSED);
+      ce.setConnectionHandle(conn);
+      while (itr.hasNext()) {
+        itr.next().connectionClosed(ce);
+      }
+    }
+    if (this.connections.isEmpty()) {
+      // safe to dissociate this managedconnection so that it can go to pool
+      if (this.initDone && !this.cache.isClosed()) {
+        this.localTran = new JCALocalTransaction(this.cache, this.gfTxMgr);
+      }
+      else {
+        this.localTran = new JCALocalTransaction();
+      }
+    }
+
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionFactory.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionFactory.java b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionFactory.java
new file mode 100644
index 0000000..8f6784d
--- /dev/null
+++ b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionFactory.java
@@ -0,0 +1,136 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.ra.spi;
+
+import java.io.PrintWriter;
+import java.util.Set;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.resource.spi.ManagedConnection;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.security.auth.Subject;
+
+import com.gemstone.gemfire.internal.ra.GFConnectionFactoryImpl;
+/**
+ * 
+ * @author asif
+ *
+ */
+public class JCAManagedConnectionFactory implements ManagedConnectionFactory
+{
+  private String productName;
+
+  private String version;
+
+  private String user;
+
+  private PrintWriter logger;
+
+  public Object createConnectionFactory() throws ResourceException
+  {
+
+    return new GFConnectionFactoryImpl(this);
+  }
+
+  public Object createConnectionFactory(ConnectionManager cm)
+      throws ResourceException
+  {
+
+    return new GFConnectionFactoryImpl(cm, this);
+  }
+
+  public ManagedConnection createManagedConnection(Subject arg0,
+      ConnectionRequestInfo arg1) throws ResourceException
+  {
+    return new JCAManagedConnection(this);
+
+  }
+
+  public PrintWriter getLogWriter() throws ResourceException
+  {
+
+    return this.logger;
+  }
+
+  public ManagedConnection matchManagedConnections(Set arg0, Subject arg1,
+      ConnectionRequestInfo arg2) throws ResourceException
+  {
+    // TODO Auto-generated method stub
+    return null;
+  }
+
+  public void setLogWriter(PrintWriter logger) throws ResourceException
+  {
+    this.logger = logger;
+
+  }
+
+  public boolean equals(Object obj)
+  {
+    if (obj instanceof JCAManagedConnectionFactory) {
+      return true;
+    }
+    else {
+      return false;
+    }
+  }
+
+  public int hashCode()
+  {
+    return 0;
+  }
+
+  public void setUserName(String user)
+  {
+
+    if (this.logger != null) {
+      logger.println("JCAManagedConnectionFactory::setUserName:. user name is="
+          + user);
+    }
+    this.user = user;
+  }
+
+  public String getUserName()
+  {
+    return this.user;
+  }
+
+  public void setProductName(String name)
+  {
+
+    if (this.logger != null) {
+      logger
+          .println("JCAManagedConnectionFactory::setProductName:. Product name is="
+              + name);
+    }
+    this.productName = name;
+  }
+
+  public String getProductName()
+  {
+    return this.productName;
+  }
+
+  public void setVersion(String version)
+  {
+
+    if (this.logger != null) {
+      logger.println("JCAManagedConnectionFactory::setVersion:. version is="
+          + version);
+    }
+    this.version = version;
+  }
+
+  public String getVersion()
+  {
+    return this.version;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionMetaData.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionMetaData.java b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionMetaData.java
new file mode 100644
index 0000000..dec4729
--- /dev/null
+++ b/gemfire-core/src/jca/java/com/gemstone/gemfire/internal/ra/spi/JCAManagedConnectionMetaData.java
@@ -0,0 +1,58 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.ra.spi;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ManagedConnectionMetaData;
+/**
+ * 
+ * @author asif
+ *
+ */
+public class JCAManagedConnectionMetaData implements ManagedConnectionMetaData
+{
+  private final String prodName;
+
+  private final String version;
+
+  private final String user;
+
+  public JCAManagedConnectionMetaData(String prodName, String version,
+      String user) {
+    this.prodName = prodName;
+    this.version = version;
+    this.user = user;
+  }
+
+  
+  public String getEISProductName() throws ResourceException
+  {
+    return this.prodName;
+  }
+
+  
+  public String getEISProductVersion() throws ResourceException
+  {
+
+    return this.version;
+  }
+
+  
+  public int getMaxConnections() throws ResourceException
+  {
+
+    return 0;
+  }
+
+  
+  public String getUserName() throws ResourceException
+  {
+    return this.user;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/jca/ra.xml
----------------------------------------------------------------------
diff --git a/gemfire-core/src/jca/ra.xml b/gemfire-core/src/jca/ra.xml
new file mode 100644
index 0000000..85c90b8
--- /dev/null
+++ b/gemfire-core/src/jca/ra.xml
@@ -0,0 +1,37 @@
+
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE connector PUBLIC '-//Sun Microsystems, Inc.//DTD Connector 1.0//EN' 'http://java.sun.com/j2ee/dtds/connector_1_0.dtd'>
+
+<connector>
+    <display-name>GFE JCA Adaptor</display-name>
+    <vendor-name>Pivotal Software</vendor-name>
+    <spec-version>1.5</spec-version>
+    <eis-type>GFE JCA</eis-type>
+    <version>1.5</version>
+    <resourceadapter>
+        <managedconnectionfactory-class>com.gemstone.gemfire.internal.ra.spi.JCAManagedConnectionFactory</managedconnectionfactory-class>
+                <config-property>
+                    <config-property-name>ProductName</config-property-name>
+                    <config-property-type>java.lang.String</config-property-type>
+                    <config-property-value>GemFire</config-property-value>
+                </config-property>
+                <config-property>
+                    <config-property-name>UserName</config-property-name>
+                    <config-property-type>java.lang.String</config-property-type>
+                    <config-property-value/>
+                </config-property>
+                <config-property>
+                    <config-property-name>Version</config-property-name>
+                    <config-property-type>java.lang.String</config-property-type>
+                    <config-property-value>8.0</config-property-value>
+                </config-property>
+        
+        <connectionfactory-interface>com.gemstone.gemfire.ra.GFConnectionFactory</connectionfactory-interface>
+        <connectionfactory-impl-class>com.gemstone.gemfire.internal.ra.GFConnectionFactoryImpl</connectionfactory-impl-class>
+        <connection-interface>com.gemstone.gemfire.ra.GFConnection</connection-interface>
+        <connection-impl-class>com.gemstone.gemfire.internal.ra.GFConnectionImpl</connection-impl-class>
+        <transaction-support>LocalTransaction</transaction-support>
+        <reauthentication-support>false</reauthentication-support> 
+    </resourceadapter>
+</connector>

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/main/java/com/gemstone/gemfire/CancelCriterion.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/CancelCriterion.java b/gemfire-core/src/main/java/com/gemstone/gemfire/CancelCriterion.java
new file mode 100644
index 0000000..fedbd49
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/CancelCriterion.java
@@ -0,0 +1,100 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire;
+
+/**
+ * Abstract cancellation proxy for cancelling an operation, esp. a thread.
+ * 
+ * Creators of services or threads should implement a subclass of CancelCriterion,
+ * and implement the two methods - cancelInProgress, and generateCancelledException(e).
+ * 
+ * Code inside the service can check to see if the service is cancelled by calling
+ * {@link #checkCancelInProgress(Throwable)}. Generally the pattern is to check
+ * before performing an operation, check if the service is canceled before propgrating 
+ * an exception futher up the stack, and check for cancelation inside a long loop.
+ * Eg.
+ * 
+ * <code>
+ * while(true) {
+ *   c.checkCancelInProgress(null);
+ *   try {
+ *      dispatchEvents();
+ *   } catch(IOException e) {
+ *     c.checkCancelInProgress(e);
+ *     throw e;
+ *   }
+ * }
+ * </code>
+ * 
+ * @author jpenney
+ * @see CancelException
+ * @since 5.1
+ */
+public abstract class CancelCriterion
+{
+  /**
+   * Indicate if the service is in the progress of being cancelled.  The
+   * typical use of this is to indicate, in the case of an {@link InterruptedException},
+   * that the current operation should be cancelled.
+   * @return null if the service is not shutting down, or a message that can be used to
+   * construct an exception indicating the service is shut down.
+   */
+  public abstract String cancelInProgress();
+//import com.gemstone.gemfire.distributed.internal.DistributionManager;
+//    * <p>
+//    * In particular, a {@link DistributionManager} returns a non-null result if
+//    * message distribution has been terminated.
+  
+  /**
+   * Use this utility  function in your implementation of cancelInProgress()
+   * and cancelled() to indicate a system failure
+   * 
+   * @return failure string if system failure has occurred
+   */
+  protected final String checkFailure() {
+    Throwable tilt = SystemFailure.getFailure();
+    if (tilt != null) {
+      // Allocate no objects here!
+      return SystemFailure.JVM_CORRUPTION;
+    }
+    return null;
+  }
+
+  /**
+   * See if the current operation is being cancelled.  If so, it either
+   * throws a {@link RuntimeException} (usually a {@link CancelException}).
+   * 
+   * @param e an underlying exception or null if there is no exception 
+   * that triggered this check
+   * @see #cancelInProgress()
+   */
+  public final void checkCancelInProgress(Throwable e) {
+    SystemFailure.checkFailure();
+    String reason = cancelInProgress();
+    if (reason == null) {
+      return;
+    }
+    throw generateCancelledException(e);
+  }
+
+  /**
+   * Template factory method for generating the exception to be thrown by
+   * {@link #checkCancelInProgress(Throwable)}. Override this to specify
+   * different exception for checkCancelInProgress() to throw.
+   * 
+   * This method should wrap the exception in a service specific 
+   * CancelationException (eg CacheClosedException). 
+   * or return null if the service is not being canceled.
+   * 
+   * @param e
+   *          an underlying exception, if any
+   * @return RuntimeException to be thrown by checkCancelInProgress(), null if
+   *         the receiver has not been cancelled.
+   */
+  abstract public RuntimeException generateCancelledException(Throwable e);
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/main/java/com/gemstone/gemfire/CancelException.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/CancelException.java b/gemfire-core/src/main/java/com/gemstone/gemfire/CancelException.java
new file mode 100644
index 0000000..5148825
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/CancelException.java
@@ -0,0 +1,55 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+/**
+ * 
+ */
+package com.gemstone.gemfire;
+
+import com.gemstone.gemfire.cache.CacheRuntimeException;
+
+/**
+ * Abstract root class of all GemFire exceptions representing system
+ * cancellation
+ * 
+ * @author jpenney
+ * @since 6.0
+ */
+public abstract class CancelException extends CacheRuntimeException {
+
+  /**
+   * for serialization
+   */
+  public CancelException() {
+  }
+
+  /**
+   * Create instance with given message
+   * @param message the message
+   */
+  public CancelException(String message) {
+    super(message);
+  }
+
+  /**
+   * Create instance with given message and cause
+   * @param message the message
+   * @param cause the cause
+   */
+  public CancelException(String message, Throwable cause) {
+    super(message, cause);
+  }
+
+  /**
+   * Create instance with empty message and given cause
+   * @param cause the cause
+   */
+  public CancelException(Throwable cause) {
+    super(cause);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/main/java/com/gemstone/gemfire/CanonicalInstantiator.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/CanonicalInstantiator.java b/gemfire-core/src/main/java/com/gemstone/gemfire/CanonicalInstantiator.java
new file mode 100644
index 0000000..4c5568b
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/CanonicalInstantiator.java
@@ -0,0 +1,77 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire;
+
+import java.io.*;
+
+/**
+ * <code>CanonicalInstantiator</code> is much like its parent
+ * <code>Instantiator</code> except that instead of
+ * needing to implement <code>newInstance()</code>
+ * you now must implement <code>newInstance(DataInput)</code>.
+ * The addition of the <code>DataInput</code> parameter allows the instance
+ * creator to optionally read data from the data input stream and use it to
+ * decide the instance to create. This allows a value that represents a
+ * canonical instance to be written by a class's {@link DataSerializer#toData}
+ * and then be read by <code>newInstance(DataInput)</code>
+ * and map it back to a canonical instance.
+ * <p>
+ * Note that {@link DataSerializer#fromData} is always called on the instance
+ * returned from <code>newInstance(DataInput)</code>.
+ *
+ * @author darrel
+ * @since 5.1
+ */
+public abstract class CanonicalInstantiator extends Instantiator {
+  /**
+   * Creates a new <code>CanonicalInstantiator</code> that instantiates a given
+   * class.
+   *
+   * @param c
+   *        The <code>DataSerializable</code> class to register.  This
+   *        class must have a static initializer that registers this
+   *        <code>Instantiator</code>. 
+   * @param classId
+   *        A unique id for class <code>c</code>.  The
+   *        <code>classId</code> must not be zero.
+   *        This has been an <code>int</code> since dsPhase1.
+   *
+   * @throws IllegalArgumentException
+   *         If <code>c</code> does not implement
+   *         <code>DataSerializable</code>, <code>classId</code> is
+   *         less than or equal to zero.
+   * @throws NullPointerException
+   *         If <code>c</code> is <code>null</code>
+   */
+  public CanonicalInstantiator(Class<? extends DataSerializable> c, int classId) {
+    super(c, classId);
+  }
+  
+  /**
+   * This method is not supported and if called will
+   * throw UnsupportedOperationException.
+   * Use {@link #newInstance(DataInput)} instead.
+   * 
+   * @throws UnsupportedOperationException in all cases
+   */
+  @Override
+  public final DataSerializable newInstance() {
+    throw new UnsupportedOperationException();
+  }
+  /**
+   * Creates a new "empty" instance of a <Code>DataSerializable</code>
+   * class whose state will be filled in by invoking its 
+   * {@link DataSerializable#fromData fromData} method.
+   * @param in the data input that can be read to decide what instance to create.
+   * @return the new "empty" instance.
+   * @throws IOException if a read from <code>in</code> fails.
+   * @since 5.1
+   */
+  public abstract DataSerializable newInstance(DataInput in)
+    throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/main/java/com/gemstone/gemfire/CopyException.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/CopyException.java b/gemfire-core/src/main/java/com/gemstone/gemfire/CopyException.java
new file mode 100644
index 0000000..3a28298
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/CopyException.java
@@ -0,0 +1,58 @@
+/*=========================================================================
+ * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * more patents listed at http://www.pivotal.io/patents.
+ *========================================================================
+ */
+package com.gemstone.gemfire;
+
+/**
+ * Indicates a failure to copy an object.
+ *
+ * @author Darrel Schneider
+ *
+ *
+ * @see CopyHelper#copy
+ * @since 4.0
+ */
+public class CopyException extends GemFireException {
+private static final long serialVersionUID = -1143711608610323585L;
+  
+  /**
+   * Constructs a new <code>CopyException</code>.
+   */
+  public CopyException() {
+    super();
+  }
+  
+  /**
+   * Constructs a new <code>CopyException</code> with a message string.
+   *
+   * @param msg a message string
+   */
+  public CopyException(String msg) {
+    super(msg);
+  }
+  
+  /**
+   * Constructs a new <code>CopyException</code> with a message string
+   * and a cause.
+   *
+   * @param msg the message string
+   * @param cause a causal Throwable
+   */
+  public CopyException(String msg, Throwable cause) {
+    super(msg, cause);
+  }
+  
+  /**
+   * Constructs a new <code>CopyException</code> with a cause.
+   *
+   * @param cause a causal Throwable
+   */
+  public CopyException(Throwable cause) {
+    super(cause);
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/main/java/com/gemstone/gemfire/CopyHelper.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/CopyHelper.java b/gemfire-core/src/main/java/com/gemstone/gemfire/CopyHelper.java
new file mode 100644
index 0000000..cd21c4c
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/CopyHelper.java
@@ -0,0 +1,259 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.UUID;
+
+import com.gemstone.gemfire.internal.HeapDataOutputStream;
+import com.gemstone.gemfire.internal.Version;
+import com.gemstone.gemfire.internal.cache.CachedDeserializable;
+import com.gemstone.gemfire.internal.cache.Token;
+import com.gemstone.gemfire.internal.i18n.LocalizedStrings;
+import com.gemstone.gemfire.pdx.PdxInstance;
+import com.gemstone.gemfire.pdx.WritablePdxInstance;
+import com.gemstone.gemfire.pdx.internal.PdxUnreadData;
+
+/**
+ * A static helper for optimally creating copies.  Creating copies
+ * of cache values provides improved concurrency as well as isolation.
+ * For transactions, creating a copy is the guaranteed way to enforce
+ * "Read Committed" isolation on changes to cache
+ * <code>Entries</code>.
+
+ * <p>Here is a simple example of how to use <code>CopyHelper.copy</code>
+ *  <pre>
+ *    Object o = r.get("stringBuf");
+ *    StringBuffer s = (StringBuffer) CopyHelper.copy(o);
+ *    s.append("... and they lived happily ever after.  The End.");
+ *    r.put("stringBuf", s);
+ *  </pre>
+ *
+ * @see Cloneable
+ * @see Serializable
+ * @see DataSerializer
+ * @see com.gemstone.gemfire.cache.Cache#setCopyOnRead
+ * @see com.gemstone.gemfire.cache.CacheTransactionManager
+ *
+ * @author Mitch Thomas
+ * @since 4.0
+ */
+
+public final class CopyHelper {
+
+  // no instances allowed
+  private CopyHelper() {
+  }
+
+  /**
+   * Return true if the given object is an instance of a well known
+   * immutable class.
+   * The well known classes are:
+   * <ul>
+   * <li>String
+   * <li>Byte
+   * <li>Character
+   * <li>Short
+   * <li>Integer
+   * <li>Long
+   * <li>Float
+   * <li>Double
+   * <li>BigInteger
+   * <li>BigDecimal
+   * <li>UUID
+   * <li>PdxInstance but not WritablePdxInstance
+   * </ul>
+   * @param o the object to check
+   * @return true if o is an instance of a well known immutable class.
+   * @since 6.6.2
+   */
+  public static boolean isWellKnownImmutableInstance(Object o) {
+    if (o instanceof String) {
+      return true;
+    }
+    if (o instanceof Number) {
+      if (o instanceof Integer) return true;
+      if (o instanceof Long) return true;
+      if (o instanceof Byte) return true;
+      if (o instanceof Short) return true;
+      if (o instanceof Float) return true;
+      if (o instanceof Double) return true;
+      // subclasses of non-final classes may be mutable
+      if (o.getClass().equals(BigInteger.class)) return true;
+      if (o.getClass().equals(BigDecimal.class)) return true;
+    }
+    if (o instanceof PdxInstance && !(o instanceof WritablePdxInstance)) {
+      // no need to copy since it is immutable
+      return true;
+    }
+    if (o instanceof Character) return true;
+    if (o instanceof UUID) return true;
+    return false;
+  }
+  /**
+   * <p>Makes a copy of the specified object. The object returned is not guaranteed
+   * to be a deep copy of the original object, as explained below.
+   * 
+   * <p>Copies can only be made if the original is a <tt>Cloneable</tt> or serializable by 
+   * GemFire.
+   * If o is a {@link #isWellKnownImmutableInstance(Object) well known immutable instance}
+   * then it will be returned without copying it.
+   * 
+   * <p>If the argument o is an instance of {@link java.lang.Cloneable}, a copy is
+   * made by invoking <tt>clone</tt> on it. Note that not all implementations of <tt>clone</tt> 
+   * make deep copies (e.g. {@link java.util.HashMap#clone HashMap.clone}). Otherwise, if the
+   * argument is not an instance of <tt>Cloneable</tt>, a copy is made using serialization: if 
+   * GemFire serialization is implemented, it is used; otherwise, java serialization is used.
+   * 
+   * <p> The difference between this method and {@link #deepCopy(Object) deepCopy}, is that
+   * this method uses <tt>clone</tt> if available, whereas <tt>deepCopy</tt> does not. As a
+   * result, for <tt>Cloneable</tt> objects copied using this method, how deep a copy the 
+   * returned object is depends on its implementation of <tt>clone</tt>. 
+   * 
+   * @param o the original object that a copy is needed of
+   * @return the new instance that is a copy of of the original
+   * @throws CopyException if copying fails because a class could not
+   * be found or could not be serialized.
+   * @see #deepCopy(Object)
+   * @since 4.0
+   */
+  @SuppressWarnings("unchecked")
+  public static <T> T copy(T o) {
+    T copy = null;
+    try {
+      if (o == null) {
+        return null;
+      } else if (o instanceof Token) {
+        return o;
+      } else {
+        if (isWellKnownImmutableInstance(o)) return o;
+        if (o instanceof Cloneable) {
+          try {
+            // Note that Object.clone is protected so we need to use reflection
+            // to call clone even though this guy implements Cloneable
+            Class<?> c = o.getClass();
+            // By convention, the user should make the clone method public.
+            // But even if they don't, let's go ahead and use it.
+            // The other problem is that if the class is private, we still
+            // need to make the method accessible even if the method is public,
+            // because Object.clone is protected.
+            Method m = c.getDeclaredMethod("clone", new Class[0]);
+            m.setAccessible(true);
+            copy = (T)m.invoke(o, new Object[0]);
+            return copy;
+          } catch (NoSuchMethodException ignore) {
+            // try using Serialization
+          } catch (IllegalAccessException ignore) {
+            // try using Serialization
+          } catch (SecurityException ignore) {
+            // try using Serialization
+          } catch (InvocationTargetException ex) {
+            Throwable cause = ex.getTargetException();
+            if (cause instanceof CloneNotSupportedException) {
+              // try using Serialization
+            } else {
+              throw new CopyException(LocalizedStrings.CopyHelper_CLONE_FAILED.toLocalizedString(), cause != null ? cause : ex);
+            }
+          }
+        } else if (o instanceof CachedDeserializable) {
+          copy = (T) ((CachedDeserializable) o).getDeserializedWritableCopy(null, null);
+          return copy;
+        } else if (o.getClass().isArray() && o.getClass().getComponentType().isPrimitive()) {
+          if (o instanceof byte[]) {
+            byte[] a = (byte[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          } else if (o instanceof boolean[]) {
+            boolean[] a = (boolean[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          } else if (o instanceof char[]) {
+            char[] a = (char[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          } else if (o instanceof int[]) {
+            int[] a = (int[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          } else if (o instanceof long[]) {
+            long[] a = (long[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          } else if (o instanceof short[]) {
+            short[] a = (short[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          } else if (o instanceof float[]) {
+            float[] a = (float[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          } else if (o instanceof double[]) {
+            double[] a = (double[])o;
+            copy = (T) Arrays.copyOf(a, a.length);
+          }
+          return copy;
+        }
+        // Copy using serialization
+        copy = doDeepCopy(o);
+        return copy;
+      }
+    } finally {
+      if (copy != null) {
+        PdxUnreadData.copy(o, copy);
+      }
+    }
+  }
+
+  /**
+   * Makes a deep copy of the specified object o using serialization, so the object
+   * has to be serializable by GemFire. 
+   * 
+   * <p>If o is a {@link #isWellKnownImmutableInstance(Object) well known immutable 
+   * instance} then it will be returned without copying it.
+   * 
+   * <p>The passed in object is serialized in memory, and then deserialized into 
+   * a new instance, which is returned. If GemFire serialization is implemented 
+   * for the object, it is used; otherwise, java serialization is used.  
+   * 
+   * @param o the original object to be copied
+   * @return the new instance that is a copy of the original
+   * @throws CopyException if copying fails because a class could not
+   * be found or could not be serialized
+   * @see #copy(Object)
+   */
+  public static <T> T deepCopy(T o) {
+    T copy = null;
+    try {
+      if (o == null) {
+        return null;
+      } else if (o instanceof Token || isWellKnownImmutableInstance(o)) {
+        return o;
+      } else {
+        copy = doDeepCopy(o);
+        return copy;
+      }
+    } finally {
+      if (copy != null) {
+        PdxUnreadData.copy(o, copy);
+      }
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private static<T> T doDeepCopy(T o) {
+    try {
+      HeapDataOutputStream hdos = new HeapDataOutputStream(Version.CURRENT);
+      DataSerializer.writeObject(o, hdos);
+      return (T)DataSerializer.readObject(new DataInputStream(hdos.getInputStream()));
+    } catch (ClassNotFoundException ex) {
+      throw new CopyException(LocalizedStrings.CopyHelper_COPY_FAILED_ON_INSTANCE_OF_0.toLocalizedString(o.getClass()), ex);
+    } catch (IOException ex) {
+      throw new CopyException(LocalizedStrings.CopyHelper_COPY_FAILED_ON_INSTANCE_OF_0.toLocalizedString(o.getClass()), ex);
+    }
+
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/19459053/gemfire-core/src/main/java/com/gemstone/gemfire/DataSerializable.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/DataSerializable.java b/gemfire-core/src/main/java/com/gemstone/gemfire/DataSerializable.java
new file mode 100644
index 0000000..034b8ff
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/DataSerializable.java
@@ -0,0 +1,131 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire;
+
+import java.io.*;
+
+/**
+ * An interface for objects whose state can be written/read as
+ * primitive types and strings ("data").  That is, instead of
+ * serializing itself to an {@link java.io.ObjectOutputStream}, a
+ * <code>DataSerializable</code> can serialize itself to a {@link
+ * DataOutput}.  By implementing this interface, objects can be
+ * serialized faster and in a more compact format than standard Java
+ * serialization.  The {@link DataSerializer} class contains a number
+ * of static methods that may be helpful to implementations of
+ * <code>DataSerializable</code>.
+ *
+ * <P>
+ *
+ * When possible, GemFire respects the <code>DataSerializable</code>
+ * contract to provide optimal object serialization.  For instance, if
+ * a <code>DataSerializable</code> object is 
+ * {@linkplain com.gemstone.gemfire.cache.Region#put(Object, Object) placed} into a distributed
+ * cache region, its <code>toData</code> method will be used to
+ * serialize it when it is sent to another member of the distributed
+ * system.
+ *
+ * <P>
+ *
+ * To avoid the overhead of Java reflection,
+ * <code>DataSerializable</code> classes may register an {@link
+ * Instantiator} to be used during deserialization.  Alternatively,
+ * classes that implement <code>DataSerializable</code> can provide a
+ * zero-argument constructor that will be invoked when they are read
+ * with {@link DataSerializer#readObject}.
+ *
+ * <P>
+ *
+ * Some classes (especially third-party classes that you may not have
+ * the source code to) cannot be modified to implement
+ * <code>DataSerializable</code>.  These classes can be data
+ * serialized by an instance of {@link DataSerializer}.
+ *
+ * <P>
+ *
+ * <code>DataSerializable</code> offers improved performance over
+ * standard Java serialization, but does not offer all of the features
+ * of standard Java serialization.  In particular, data serialization
+ * does not attempt to maintain referential integrity among the
+ * objects it is writing or reading.  As a result, data serialization
+ * should not be used with complex object graphs.  Attempting to data
+ * serialize graphs that contain object cycles will result in infinite
+ * recursion and a {@link StackOverflowError}.  Attempting to
+ * deserialize an object graph that contains multiple reference
+ * paths to the same object will result in multiple copies of the
+ * objects that are referred to through multiple paths.
+ *
+ * <P>
+ *
+ * <CENTER>
+ * <IMG src="doc-files/data-serialization-exceptions.gif" 
+ *      HEIGHT="219" WIDTH="698">
+ * </CENTER>
+ *
+ * @see java.io.Serializable
+ * @see DataSerializer
+ * @see Instantiator
+ *
+ * @author David Whitlock
+ * @since 3.5 */
+public interface DataSerializable extends Serializable {
+
+  /**
+   * Writes the state of this object as primitive data to the given
+   * <code>DataOutput</code>.
+   * <p>
+   * Since 5.7 it is possible for any method call to the specified
+   * <code>DataOutput</code> to throw {@link GemFireRethrowable}.
+   * It should <em>not</em> be caught by user code.
+   * If it is it <em>must</em> be rethrown.
+   *
+   * @throws IOException
+   *         A problem occurs while writing to <code>out</code>
+   */
+  public void toData(DataOutput out) throws IOException;
+
+  /**
+   * Reads the state of this object as primitive data from the given
+   * <code>DataInput</code>. 
+   *
+   * @throws IOException
+   *         A problem occurs while reading from <code>in</code>
+   * @throws ClassNotFoundException
+   *         A class could not be loaded while reading from
+   *         <code>in</code> 
+   */
+  public void fromData(DataInput in)
+    throws IOException, ClassNotFoundException;
+
+  ////////////////////////  Inner Classes  ////////////////////////
+
+  /**
+   * <code>Replaceable</code> allows an object to write an alternative
+   * version of itself to a <code>DataOutput</code>.  It is similar to
+   * the <code>writeReplace</code> method of standard Java
+   * {@linkplain java.io.Serializable serialization}.  
+   *
+   * <P>
+   *
+   * Note that if a <code>Replaceable</code> is also
+   * <code>DataSerializable</code>, its <code>toData</code> method
+   * will <B>not</B> be invoked.  Instead, its replacement object will
+   * be written to the stream using {@link DataSerializer#writeObject(Object, DataOutput)}. 
+   *
+   * @see DataSerializer#writeObject(Object, DataOutput)
+   */
+  public interface Replaceable {
+
+    /**
+     * Replaces this object with another in the "output stream"
+     * written by {@link DataSerializer#writeObject(Object, DataOutput)}.
+     */
+    public Object replace() throws IOException;
+  }
+
+}