Repository: groovy
Updated Branches:
  refs/heads/GROOVY_2_6_X 40c7fcef1 -> 7c408bb99


fix serializable incompatibility with 2_4_X


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/7c408bb9
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/7c408bb9
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/7c408bb9

Branch: refs/heads/GROOVY_2_6_X
Commit: 7c408bb99f2bf589740cfe40b9d2638d9b2bc350
Parents: 40c7fce
Author: Paul King <pa...@asert.com.au>
Authored: Wed Apr 11 22:52:18 2018 +1000
Committer: Paul King <pa...@asert.com.au>
Committed: Wed Apr 11 22:53:00 2018 +1000

----------------------------------------------------------------------
 src/main/groovy/groovy/lang/GroovyObjectSupport.java         | 2 --
 .../java/org/codehaus/groovy/runtime/ComposedClosure.java    | 2 +-
 src/main/java/org/codehaus/groovy/runtime/ConvertedMap.java  | 4 +---
 .../java/org/codehaus/groovy/runtime/CurriedClosure.java     | 2 +-
 .../org/codehaus/groovy/runtime/GroovyCategorySupport.java   | 8 +++-----
 .../codehaus/groovy/runtime/InvokerInvocationException.java  | 4 +---
 .../org/codehaus/groovy/runtime/IteratorClosureAdapter.java  | 4 +---
 src/main/java/org/codehaus/groovy/runtime/MethodClosure.java | 2 +-
 .../groovy/runtime/metaclass/ConcurrentReaderHashMap.java    | 3 +--
 .../groovy/runtime/metaclass/MethodSelectionException.java   | 3 +--
 .../runtime/metaclass/MissingMethodExceptionNoStack.java     | 2 +-
 .../runtime/metaclass/MissingMethodExecutionFailed.java      | 4 ++--
 .../runtime/metaclass/MissingPropertyExceptionNoStack.java   | 2 +-
 .../groovy/runtime/powerassert/PowerAssertionError.java      | 4 +---
 .../java/org/codehaus/groovy/tools/gse/StringSetMap.java     | 2 +-
 .../java/org/codehaus/groovy/util/AbstractConcurrentMap.java | 2 +-
 .../org/codehaus/groovy/util/AbstractConcurrentMapBase.java  | 2 +-
 src/main/java/org/codehaus/groovy/util/FastArray.java        | 4 +++-
 src/main/java/org/codehaus/groovy/util/LazyReference.java    | 2 +-
 .../java/org/codehaus/groovy/util/ManagedConcurrentMap.java  | 2 +-
 20 files changed, 24 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/groovy/groovy/lang/GroovyObjectSupport.java
----------------------------------------------------------------------
diff --git a/src/main/groovy/groovy/lang/GroovyObjectSupport.java 
b/src/main/groovy/groovy/lang/GroovyObjectSupport.java
index cf7a77f..d08ecd6 100644
--- a/src/main/groovy/groovy/lang/GroovyObjectSupport.java
+++ b/src/main/groovy/groovy/lang/GroovyObjectSupport.java
@@ -22,8 +22,6 @@ import org.codehaus.groovy.runtime.InvokerHelper;
 
 /**
  * A useful base class for Java objects wishing to be Groovy objects
- *
- * @author <a href="mailto:ja...@coredevelopers.net";>James Strachan</a>
  */
 public abstract class GroovyObjectSupport implements GroovyObject {
 

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/ComposedClosure.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/ComposedClosure.java 
b/src/main/java/org/codehaus/groovy/runtime/ComposedClosure.java
index 56ba50a..52f52cb 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ComposedClosure.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ComposedClosure.java
@@ -57,7 +57,7 @@ import java.util.List;
  */
 public final class ComposedClosure<V> extends Closure<V> {
 
-    private static final long serialVersionUID = 1290542293376731831L;
+    private static final long serialVersionUID = -4816724431590921285L;
     private Closure first;
     private Closure<V> second;
 

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/ConvertedMap.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/ConvertedMap.java 
b/src/main/java/org/codehaus/groovy/runtime/ConvertedMap.java
index 9bc71fa..c0c9812 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ConvertedMap.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ConvertedMap.java
@@ -26,12 +26,10 @@ import java.util.Map;
 /**
  * This class is a general adapter to adapt a map of closures to
  * any Java interface.
- *
- * @author <a href="mailto:blackd...@gmx.org";>Jochen Theodorou</a>
  */
 public class ConvertedMap extends ConversionHandler {
 
-    private static final long serialVersionUID = -8131432558241254137L;
+    private static final long serialVersionUID = 8535543126684786030L;
 
     /**
      * to create a ConvertedMap object.

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java 
b/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java
index 1db1037..e9365be 100644
--- a/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java
+++ b/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java
@@ -46,7 +46,7 @@ import groovy.lang.Closure;
  */
 public final class CurriedClosure<V> extends Closure<V> {
 
-    private static final long serialVersionUID = -1018388175778192754L;
+    private static final long serialVersionUID = 2077643745780234126L;
     private final Object[] curriedParams;
     private final int minParamsExpected;
     private int index;

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/GroovyCategorySupport.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/GroovyCategorySupport.java 
b/src/main/java/org/codehaus/groovy/runtime/GroovyCategorySupport.java
index 05ce6b0..8843f11 100644
--- a/src/main/java/org/codehaus/groovy/runtime/GroovyCategorySupport.java
+++ b/src/main/java/org/codehaus/groovy/runtime/GroovyCategorySupport.java
@@ -38,16 +38,14 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * @author sam
- * @author Paul King
- * @author Alex Tkachman
+ * Support methods for Groovy category usage
  */
 public class GroovyCategorySupport {
 
     private static int categoriesInUse = 0;
 
     public static class CategoryMethodList extends ArrayList<CategoryMethod> {
-        private static final long serialVersionUID = 1569020062006842141L;
+        private static final long serialVersionUID = 1631799972200881802L;
         public final int level;
         final CategoryMethodList previous;
         final AtomicInteger usage;
@@ -73,7 +71,7 @@ public class GroovyCategorySupport {
     public static class ThreadCategoryInfo extends HashMap<String, 
CategoryMethodList>{
 
         private static final Object LOCK = new Object();
-        private static final long serialVersionUID = 2609120843123833410L;
+        private static final long serialVersionUID = 1348443374952726263L;
 
         int level;
 

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/InvokerInvocationException.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/InvokerInvocationException.java 
b/src/main/java/org/codehaus/groovy/runtime/InvokerInvocationException.java
index da85b6b..8fb5572 100644
--- a/src/main/java/org/codehaus/groovy/runtime/InvokerInvocationException.java
+++ b/src/main/java/org/codehaus/groovy/runtime/InvokerInvocationException.java
@@ -24,12 +24,10 @@ import java.lang.reflect.InvocationTargetException;
 
 /**
  * An exception thrown if a method is called and an exception occurred
- * 
- * @author <a href="mailto:ja...@coredevelopers.net";>James Strachan</a>
  */
 public class InvokerInvocationException extends GroovyRuntimeException {
 
-    private static final long serialVersionUID = 5870532233180451709L;
+    private static final long serialVersionUID = 1337849572129640775L;
 
     public InvokerInvocationException(InvocationTargetException e) {
         super(e.getTargetException());

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/IteratorClosureAdapter.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/IteratorClosureAdapter.java 
b/src/main/java/org/codehaus/groovy/runtime/IteratorClosureAdapter.java
index 7f098d7..ea08d2f 100644
--- a/src/main/java/org/codehaus/groovy/runtime/IteratorClosureAdapter.java
+++ b/src/main/java/org/codehaus/groovy/runtime/IteratorClosureAdapter.java
@@ -27,12 +27,10 @@ import java.util.List;
 /**
  * A closure which stores calls in a List so that method calls 
  * can be iterated over in a 'yield' style way
- * 
- * @author <a href="mailto:ja...@coredevelopers.net";>James Strachan</a>
  */
 public class IteratorClosureAdapter<T> extends Closure {
 
-    private static final long serialVersionUID = -3193812539363103534L;
+    private static final long serialVersionUID = -7485077849389539770L;
     private final List<T> list = new ArrayList<T>();
     private MetaClass metaClass = InvokerHelper.getMetaClass(getClass());
     

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/MethodClosure.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/MethodClosure.java 
b/src/main/java/org/codehaus/groovy/runtime/MethodClosure.java
index 938347b..7314c1e 100644
--- a/src/main/java/org/codehaus/groovy/runtime/MethodClosure.java
+++ b/src/main/java/org/codehaus/groovy/runtime/MethodClosure.java
@@ -35,7 +35,7 @@ public class MethodClosure extends Closure {
     public static final String NEW = "new";
     public static final String ANY_INSTANCE_METHOD_EXISTS = 
"anyInstanceMethodExists";
 
-    private static final long serialVersionUID = 5316055624606528584L;
+    private static final long serialVersionUID = -2491254866810955844L;
     public static boolean ALLOW_RESOLVE = false;
 
     private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/metaclass/ConcurrentReaderHashMap.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/ConcurrentReaderHashMap.java
 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/ConcurrentReaderHashMap.java
index 2d501b3..ef7da8f 100644
--- 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/ConcurrentReaderHashMap.java
+++ 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/ConcurrentReaderHashMap.java
@@ -167,7 +167,7 @@ public class ConcurrentReaderHashMap
 
   /** A Serializable class for barrier lock **/
   protected static class BarrierLock implements java.io.Serializable {
-      private static final long serialVersionUID = -5403150101810674636L;
+      private static final long serialVersionUID = -2159505361622844863L;
   }
 
   /**
@@ -178,7 +178,6 @@ public class ConcurrentReaderHashMap
   /**
    * field written to only to guarantee lock ordering.
    **/
-
   protected transient Object lastWrite;
 
   /**

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
index 4f0cc4c..06272ed 100644
--- 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
+++ 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MethodSelectionException.java
@@ -32,12 +32,11 @@ import java.lang.reflect.Modifier;
  * <p>
  * <b>Note:</b> This exception as for internal use only!
  * 
- * @author Jochen Theodorou
  * @since Groovy 1.1
  */
 public class MethodSelectionException extends GroovyRuntimeException {
 
-    private static final long serialVersionUID = 6260193948973669540L;
+    private static final long serialVersionUID = 8126246630023758333L;
     private final String methodName;
     private final FastArray methods;
     private final Class[] arguments;

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExceptionNoStack.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExceptionNoStack.java
 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExceptionNoStack.java
index 80836c7..954dc6b 100644
--- 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExceptionNoStack.java
+++ 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExceptionNoStack.java
@@ -22,7 +22,7 @@ import groovy.lang.MissingMethodException;
 
 public class MissingMethodExceptionNoStack extends MissingMethodException {
 
-    private static final long serialVersionUID = 7075950754138801519L;
+    private static final long serialVersionUID = -4567395518573062216L;
 
     public MissingMethodExceptionNoStack(String method, Class type, Object[] 
arguments) {
         this(method,type,arguments,false);

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExecutionFailed.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExecutionFailed.java
 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExecutionFailed.java
index 557176d..b2bd6bc 100644
--- 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExecutionFailed.java
+++ 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingMethodExecutionFailed.java
@@ -20,11 +20,11 @@ package org.codehaus.groovy.runtime.metaclass;
 
 /**
  * A stack less exception used to indicate, that the execution of a 
missingMethod
- * method failed with a MissingMethodException. This is used to preven a call 
to
+ * method failed with a MissingMethodException. This is used to prevent a call 
to
  * invokeMethod for GroovyObject implementing classes.
  */
 public class MissingMethodExecutionFailed extends 
MissingMethodExceptionNoStack {
-    private static final long serialVersionUID = -6551412223364004284L;
+    private static final long serialVersionUID = -7894095278952483769L;
     private Throwable cause;
     public MissingMethodExecutionFailed(String method, Class type, Object[] 
arguments, boolean isStatic, Throwable cause) {
         super(method, type, arguments, isStatic);

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingPropertyExceptionNoStack.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingPropertyExceptionNoStack.java
 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingPropertyExceptionNoStack.java
index a177eab..3f7926e 100644
--- 
a/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingPropertyExceptionNoStack.java
+++ 
b/src/main/java/org/codehaus/groovy/runtime/metaclass/MissingPropertyExceptionNoStack.java
@@ -22,7 +22,7 @@ import groovy.lang.MissingPropertyException;
 
 public class MissingPropertyExceptionNoStack extends MissingPropertyException {
 
-    private static final long serialVersionUID = -7734212543734003079L;
+    private static final long serialVersionUID = 8993570436675442348L;
 
     public MissingPropertyExceptionNoStack(String propertyName, Class 
theClass) {
         super(propertyName, theClass);

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/runtime/powerassert/PowerAssertionError.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/runtime/powerassert/PowerAssertionError.java
 
b/src/main/java/org/codehaus/groovy/runtime/powerassert/PowerAssertionError.java
index b79f0d7..498f1fa 100644
--- 
a/src/main/java/org/codehaus/groovy/runtime/powerassert/PowerAssertionError.java
+++ 
b/src/main/java/org/codehaus/groovy/runtime/powerassert/PowerAssertionError.java
@@ -20,11 +20,9 @@ package org.codehaus.groovy.runtime.powerassert;
 
 /**
  * Indicates that a power assertion has failed.
- *
- * @author Peter Niederwieser
  */
 public class PowerAssertionError extends java.lang.AssertionError {
-    private static final long serialVersionUID = 186840762256433109L;
+    private static final long serialVersionUID = -2204531294530022591L;
 
     public PowerAssertionError(String msg) {
         super(msg);

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/tools/gse/StringSetMap.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/tools/gse/StringSetMap.java 
b/src/main/java/org/codehaus/groovy/tools/gse/StringSetMap.java
index 4d5117d..fe2b7ad 100644
--- a/src/main/java/org/codehaus/groovy/tools/gse/StringSetMap.java
+++ b/src/main/java/org/codehaus/groovy/tools/gse/StringSetMap.java
@@ -25,7 +25,7 @@ import java.util.TreeSet;
 
 public class StringSetMap extends LinkedHashMap<String,Set<String>> {
 
-    private static final long serialVersionUID = 4230491822783819152L;
+    private static final long serialVersionUID = -8603734698633884431L;
 
     public StringSetMap() {
         super();

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMap.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMap.java 
b/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMap.java
index 349c930..c341326 100644
--- a/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMap.java
+++ b/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMap.java
@@ -50,7 +50,7 @@ public abstract class AbstractConcurrentMap<K, V> extends 
AbstractConcurrentMapB
 
     public abstract static class Segment<K,V> extends 
AbstractConcurrentMapBase.Segment {
 
-        private static final long serialVersionUID = 5192533863182570468L;
+        private static final long serialVersionUID = -2392526467736920612L;
 
         protected Segment(int initialCapacity) {
             super(initialCapacity);

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMapBase.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMapBase.java 
b/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMapBase.java
index 2cfc82a..f0625f6 100644
--- a/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMapBase.java
+++ b/src/main/java/org/codehaus/groovy/util/AbstractConcurrentMapBase.java
@@ -154,7 +154,7 @@ public abstract class AbstractConcurrentMapBase {
     }
 
     public static class Segment extends LockableObject {
-        private static final long serialVersionUID = -1071886855389945760L;
+        private static final long serialVersionUID = -4128828550135386431L;
         volatile int count;
 
         int threshold;

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/util/FastArray.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/util/FastArray.java 
b/src/main/java/org/codehaus/groovy/util/FastArray.java
index 8881af2..17e6f6d 100644
--- a/src/main/java/org/codehaus/groovy/util/FastArray.java
+++ b/src/main/java/org/codehaus/groovy/util/FastArray.java
@@ -18,12 +18,14 @@
  */
 package org.codehaus.groovy.util;
 
+import java.io.Serializable;
 import java.util.AbstractList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
-public class FastArray implements Cloneable {
+public class FastArray implements Cloneable, Serializable {
+    private static final long serialVersionUID = -9143440116071577249L;
     private Object[] data;
     public int size;
     public static final FastArray EMPTY_LIST = new FastArray(0);

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/util/LazyReference.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/util/LazyReference.java 
b/src/main/java/org/codehaus/groovy/util/LazyReference.java
index 54e0ab2..a8abc15 100644
--- a/src/main/java/org/codehaus/groovy/util/LazyReference.java
+++ b/src/main/java/org/codehaus/groovy/util/LazyReference.java
@@ -24,7 +24,7 @@ package org.codehaus.groovy.util;
 public abstract class LazyReference<T> extends LockableObject {
     private static final ManagedReference INIT = new 
ManagedReference(ReferenceType.HARD,null,null){};
     private static final ManagedReference NULL_REFERENCE = new 
ManagedReference(ReferenceType.HARD,null,null){};
-    private static final long serialVersionUID = 3160238516132794621L;
+    private static final long serialVersionUID = -828564509716680325L;
     private ManagedReference<T> reference = INIT;
     private final ReferenceBundle bundle;
     

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c408bb9/src/main/java/org/codehaus/groovy/util/ManagedConcurrentMap.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/util/ManagedConcurrentMap.java 
b/src/main/java/org/codehaus/groovy/util/ManagedConcurrentMap.java
index da06275..d1cf760 100644
--- a/src/main/java/org/codehaus/groovy/util/ManagedConcurrentMap.java
+++ b/src/main/java/org/codehaus/groovy/util/ManagedConcurrentMap.java
@@ -33,7 +33,7 @@ public class ManagedConcurrentMap<K,V> extends 
AbstractConcurrentMap<K,V> {
     }
 
     public static class Segment<K,V> extends 
AbstractConcurrentMap.Segment<K,V>{
-        private static final long serialVersionUID = -2157582627873688747L;
+        private static final long serialVersionUID = 2742952509311037869L;
         protected final ReferenceBundle bundle;
         public Segment(ReferenceBundle bundle, int cap) {
             super(cap);

Reply via email to