You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@reef.apache.org by we...@apache.org on 2015/02/05 22:05:51 UTC

[30/51] [partial] incubator-reef git commit: [REEF-131] Towards the new .Net project structure This is to change .Net project structure for Tang, Wake, REEF utilities, Common and Driver:

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Types/INode.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Types/INode.cs b/lang/cs/Org.Apache.REEF.Tang/Types/INode.cs
new file mode 100644
index 0000000..aade8bb
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Types/INode.cs
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+
+namespace Org.Apache.REEF.Tang.Types
+{
+    public interface INode : IComparable<INode>, ITraversable<INode> 
+    {        
+        string GetName();
+
+        string GetFullName();
+
+        bool Contains(string key);
+
+        INode Get(string key);
+
+        INode GetParent();
+
+        void Add(INode node);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Types/IPackageNode.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Types/IPackageNode.cs b/lang/cs/Org.Apache.REEF.Tang/Types/IPackageNode.cs
new file mode 100644
index 0000000..873f511
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Types/IPackageNode.cs
@@ -0,0 +1,24 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+namespace Org.Apache.REEF.Tang.Types
+{
+    public interface IPackageNode : INode
+    {
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Types/ITraversable.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Types/ITraversable.cs b/lang/cs/Org.Apache.REEF.Tang/Types/ITraversable.cs
new file mode 100644
index 0000000..eed28e9
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Types/ITraversable.cs
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System.Collections.Generic;
+
+namespace Org.Apache.REEF.Tang.Types
+{
+    public interface ITraversable<T> where T : ITraversable<T>
+    {
+        ICollection<T> GetChildren();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/AbstractMonotonicMultiMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/AbstractMonotonicMultiMap.cs b/lang/cs/Org.Apache.REEF.Tang/Util/AbstractMonotonicMultiMap.cs
new file mode 100644
index 0000000..22cb4a6
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/AbstractMonotonicMultiMap.cs
@@ -0,0 +1,263 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public abstract class AbstractMonotonicMultiMap<K, V> : ICollection<KeyValuePair<K, V>>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(AbstractMonotonicMultiMap<K, V>));
+
+        private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+        private IDictionary<K, ISet<V>> map;
+
+        private int size = 0;
+
+        public AbstractMonotonicMultiMap(IDictionary<K, ISet<V>> map)
+        {
+            this.map = map;
+        }
+
+        public ICollection<K> Keys
+        {
+            get { return map.Keys; }
+        }
+
+        public int Count
+        {
+            get { return size; }
+        }
+
+        public bool IsReadOnly
+        {
+            get { throw new NotImplementedException(); }
+        }
+
+        public void Add(K key, V val)
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                ISet<V> vals;
+                map.TryGetValue(key, out vals);
+
+                if (vals == null)
+                {
+                    vals = new MonotonicHashSet<V>();
+                    map.Add(key, vals);
+                }
+                vals.Add(val);
+                size++;
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+        }
+
+        public ISet<V> GetValuesForKey(K key)
+        {
+            _lock.EnterReadLock();
+            try
+            {
+                ISet<V> ret;
+                map.TryGetValue(key, out ret);
+                if (ret == null)
+                {
+                    return new MonotonicHashSet<V>();
+                }
+                return ret;
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        public bool Contains(K key, V val)
+        {
+            _lock.EnterReadLock();
+            try
+            {
+                ISet<V> vals;
+                map.TryGetValue(key, out vals);
+
+                if (vals != null)
+                {
+                    return vals.Contains(val);
+                }
+                return false;
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        public bool Add(KeyValuePair<K, V> e)
+        {
+            Add(e.Key, e.Value);
+            return true;
+        }
+
+        public bool AddAll(ICollection<KeyValuePair<K, V>> c) // where T : KeyValuePair<K, V>
+        {
+            bool ret = false;
+            foreach (KeyValuePair<K, V> e in c) 
+            {
+                Add(e);
+                ret = true;
+            }
+            return ret;
+        }
+
+        public void Clear()
+        {
+            throw new NotSupportedException("MonotonicMultiMap cannot be cleared!");
+        }
+
+        public bool Contains(object o) 
+        {
+            KeyValuePair<K, V> e = (KeyValuePair<K, V>)o;
+            return Contains((K)e.Key, (V)e.Value);
+        }
+
+        public bool ContainsAll<T>(ICollection<T> c) 
+        {
+            foreach (object o in c) 
+            {
+                if (!Contains(o)) 
+                { 
+                    return false; 
+                }
+            }
+            return true;
+        }
+
+        public bool IsEmpty()
+        {
+            return size == 0;
+        }
+
+        public ISet<V> Values() 
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                ISet<V> s = new HashSet<V>();
+                foreach (KeyValuePair<K, V> e in this)
+                {
+                    s.Add(e.Value);
+                }
+                return s;
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        public int Size()
+        {
+            return size;
+        }
+
+        public bool ContainsKey(K k)
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                if (map.ContainsKey(k))
+                {
+                    return (GetValuesForKey(k).Count != 0);
+                }
+                return false;
+            }
+            finally 
+            {                
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        void ICollection<KeyValuePair<K, V>>.Add(KeyValuePair<K, V> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void CopyTo(KeyValuePair<K, V>[] array, int arrayIndex)
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool Remove(KeyValuePair<K, V> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        public bool Contains(KeyValuePair<K, V> item)
+        {
+            throw new NotImplementedException();
+        }
+
+        public IEnumerator<KeyValuePair<K, V>> GetEnumerator()
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                return map.SelectMany(kvp => kvp.Value, (kvp, v) => new KeyValuePair<K, V>(kvp.Key, v)).GetEnumerator();
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+        }
+
+        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/AssemblyLoader.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/AssemblyLoader.cs b/lang/cs/Org.Apache.REEF.Tang/Util/AssemblyLoader.cs
new file mode 100644
index 0000000..f5e30f9
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/AssemblyLoader.cs
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class AssemblyLoader
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(AssemblyLoader));
+
+        public IList<Assembly> Assemblies { get; set; }
+
+        public AssemblyLoader(string[] files)
+        {
+            Assemblies = new List<Assembly>();
+            foreach (var a in files)
+            {
+                Assemblies.Add(Assembly.Load(a));
+            }
+        }
+
+        public Type GetType(string name)
+        {           
+            Type t = Type.GetType(name);
+            if (t == null)
+            {
+                foreach (var a in Assemblies)
+                {
+                    t = a.GetType(name);
+                    if (t != null)
+                    {
+                        return t;
+                    }
+                }
+
+                foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
+                {
+                    t = a.GetType(name);
+                    if (t != null)
+                        break;
+                }
+            }
+
+            if (t == null)
+            {
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Not able to get Type from the name provided: " + name), LOGGER);
+            }
+            return t;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/GenericType.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/GenericType.cs b/lang/cs/Org.Apache.REEF.Tang/Util/GenericType.cs
new file mode 100644
index 0000000..361ffdf
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/GenericType.cs
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class GenericType<T>
+    {
+        public static readonly GenericType<T> Class = null;
+
+        public Type TypeT 
+        {
+            get { return typeof(T); }
+        }
+
+        public override bool Equals(object obj)
+        {
+            GenericType<T> other = obj as GenericType<T>;
+            if (other == null)
+            {
+                return false;
+            }
+
+            return TypeT == other.TypeT;
+        }
+
+        public override int GetHashCode()
+        {
+            return TypeT.GetHashCode();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashMap.cs b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashMap.cs
new file mode 100644
index 0000000..7c5d4c6
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashMap.cs
@@ -0,0 +1,83 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class MonotonicHashMap<T, U> : Dictionary<T, U>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicHashMap<T, U>));
+
+        public new void Add(T key, U value)
+        {
+            U old;
+            TryGetValue(key, out old);
+            if (old != null)
+            {
+                var ex = new ArgumentException("Attempt to re-add: [" + key + "] old value: " + old + " new value " + value);
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+            }
+            base.Add(key, value);
+        }
+
+        public void AddAll(IDictionary<T, U> m) 
+        {
+            foreach (T t in m.Keys) 
+            {
+                if (ContainsKey(t)) 
+                {
+                   U old;
+                   m.TryGetValue(t, out old);
+                   Add(t, old); // guaranteed to throw.
+                }
+            }
+            foreach (T t in m.Keys) 
+            {
+                U old;
+                m.TryGetValue(t, out old);
+                Add(t, old);
+            }
+        }
+
+        public bool IsEmpty()
+        {
+            return Count == 0;
+        }
+
+        public U Get(T key)
+        {
+            U val;
+            TryGetValue(key, out val);
+            return val;
+        }
+
+        public new void Clear() 
+        {
+            throw new NotSupportedException();
+        }
+
+        public new bool Remove(T key)
+        {
+            throw new NotSupportedException();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashSet.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashSet.cs b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashSet.cs
new file mode 100644
index 0000000..3239719
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicHashSet.cs
@@ -0,0 +1,131 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class MonotonicHashSet<T> : HashSet<T>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicHashSet<T>));
+        private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+        public MonotonicHashSet()
+        {           
+        }
+
+        public MonotonicHashSet(IEnumerable<T> collection)
+            : base(collection)
+        {
+        }
+
+        public MonotonicHashSet(T[] collection)
+            : base(collection.ToList())
+        {
+        }
+
+        public new bool Add(T e)
+        {
+            _lock.EnterWriteLock();
+
+            try
+            {
+                if (Contains(e))
+                {
+                    var ex = new ArgumentException("Attempt to re-add " + e
+                                                   + " to MonotonicSet!");
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                return base.Add(e);
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+        }
+
+        public bool AddAll(ICollection<T> c)
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                foreach (T t in c)
+                {
+                    if (Contains(t))
+                    {
+                        var ex = new ArgumentException("Attempt to re-add " + t
+                                                       + " to MonotonicSet!");
+                        Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                    }
+                    base.Add(t);
+                }
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+            return c.Count != 0;
+        }
+
+        public bool ContainsAll(ICollection<T> c)
+        {
+            _lock.EnterReadLock();
+
+            try
+            {
+                foreach (T t in c)
+                {
+                    if (!Contains(t))
+                    {
+                        return false;
+                    }
+                }
+            }
+            finally
+            {
+                if (_lock.IsReadLockHeld)
+                {
+                    _lock.ExitReadLock();
+                }
+            }
+            return true;
+        }
+
+        public new void Clear() 
+        {
+            Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to clear MonotonicSet!"), LOGGER);
+        }
+ 
+        public bool Remove(object o) 
+        {
+            Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to remove " + o + " from MonotonicSet!"), LOGGER);
+            return false;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiHashMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiHashMap.cs b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiHashMap.cs
new file mode 100644
index 0000000..fca5ffd
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiHashMap.cs
@@ -0,0 +1,30 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System.Collections.Generic;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class MonotonicMultiHashMap<K, V> : AbstractMonotonicMultiMap<K, V> 
+    {
+        public MonotonicMultiHashMap() : base(new MonotonicHashMap<K, ISet<V>>())
+        {
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiMap.cs b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiMap.cs
new file mode 100644
index 0000000..38b2e5c
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicMultiMap.cs
@@ -0,0 +1,30 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System.Collections.Generic;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class MonotonicMultiMap<K, V> : AbstractMonotonicMultiMap<K, V> 
+    {
+        public MonotonicMultiMap() : base(new MonotonicTreeMap<K, ISet<V>>())
+        {
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicSet.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicSet.cs b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicSet.cs
new file mode 100644
index 0000000..e8831ff
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicSet.cs
@@ -0,0 +1,106 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class MonotonicSet<T> : SortedSet<T>
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicSet<T>));
+
+        //private static readonly long serialVersionUID = 1L;
+        public MonotonicSet() : base()
+        {
+        }
+
+        //public MonotonicSet(SortedSet<T> c) : base(c.Comparer)
+        //{
+        //    AddAll(c);
+        //}
+
+        public MonotonicSet(ICollection<T> c)
+            : base(c)
+        {
+        }
+
+        public MonotonicSet(IComparer<T> c)
+            : base(c)
+        {
+        }
+
+        public new bool Add(T e) //TODO
+        {
+            if (this.Contains(e))
+            {
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new ArgumentException("Attempt to re-add " + e
+                    + " to MonotonicSet!"), LOGGER);
+            }
+            return base.Add(e);
+        }
+
+        public bool AddAll(ICollection<T> c)
+        {
+            foreach (T t in c)
+            {
+                this.Add(t);
+            }
+            return c.Count != 0;
+        }
+
+        public bool ContainsAll(ICollection<T> c)
+        {
+            foreach (T t in c)
+            {
+                if (!this.Contains(t))
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        public bool AddAllIgnoreDuplicates(ICollection<T> c) 
+        {
+            bool ret = false;
+            foreach (T t in c) 
+            {
+                if (!Contains(t)) 
+                {
+                    Add(t);
+                    ret = true;
+                }
+            }
+            return ret;
+        }
+
+        public override void Clear() 
+        {
+            Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to clear MonotonicSet!"), LOGGER);
+        }
+
+        public bool Remove(Object o)
+        {
+            Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException("Attempt to remove " + o
+                + " from MonotonicSet!"), LOGGER);
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicTreeMap.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicTreeMap.cs b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicTreeMap.cs
new file mode 100644
index 0000000..328dfb7
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/MonotonicTreeMap.cs
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class MonotonicTreeMap<TKey, TVal> : SortedDictionary<TKey, TVal> 
+    {
+        private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(MonotonicTreeMap<TKey, TVal>));
+
+        public new void Add(TKey key, TVal value) 
+        {
+            _lock.EnterWriteLock();
+            try
+            {
+                TVal val;
+                if (base.TryGetValue(key, out val))
+                {
+                    var ex = new ArgumentException("Attempt to re-add: [" + key
+                                                   + "]\n old value: " + val + " new value " + value);
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                else
+                {
+                    base.Add(key, value);
+                }
+            }
+            finally
+            {
+                if (_lock.IsWriteLockHeld)
+                {
+                    _lock.ExitWriteLock();
+                }
+            }
+        }
+
+        public new void Clear() //TODO
+        {
+            throw new NotSupportedException();
+        }
+
+        public new void Remove(TKey key) //TODO
+        {
+            throw new NotSupportedException();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/ReflectionUtilities.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/ReflectionUtilities.cs b/lang/cs/Org.Apache.REEF.Tang/Util/ReflectionUtilities.cs
new file mode 100644
index 0000000..bd50e77
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/ReflectionUtilities.cs
@@ -0,0 +1,594 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Org.Apache.REEF.Utilities.Logging;
+using Org.Apache.REEF.Tang.Annotations;
+using Org.Apache.REEF.Tang.Exceptions;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    public class ReflectionUtilities
+    {
+        private static readonly Logger LOGGER = Logger.GetLogger(typeof(ReflectionUtilities));
+
+        public static readonly string Regexp = "[\\.\\+]";
+
+        /// <summary>
+        /// Gets the AssemblyQualifiedName from the Type. This name is used in ClassHierarchy
+        /// as a key when add a node as a child to parent. THe name is used as FullName in a Node
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ArgumentException">null is passed in FullName() in ReflectionUtilities</exception>
+        public static string GetAssemblyQualifiedName(Type name)
+        {
+            if (name == null)
+            {
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new ArgumentException("null is passed in FullName() in ReflectionUtilities"), LOGGER);
+            }
+
+            Type t = EnsureInterfaceType(name);
+
+            if (t.AssemblyQualifiedName == null && t.Name == null && t.FullName == null)
+            {
+                LOGGER.Log(Level.Warning, "The type's name is null: " + t.ToString());
+            }
+
+            if (t.AssemblyQualifiedName == null && t.Name != null)
+            {
+                    return t.Name;
+            }
+
+            return t.AssemblyQualifiedName;
+        }
+
+        /// <summary>
+        /// It returns Type.FullName. This name is used as Name in a Node. 
+        /// It is not unique for a generic type with different type of arguments.
+        /// It is used for toString or debug info as AssemblyQualifiedName is really long
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        public static string GetName(Type name)
+        {
+            if (name.FullName != null)
+            {
+                return name.FullName;
+            }
+
+            //The following lines should be not reached by C# syntax definition. However, it happens  for some generic type such as AbstractObserver<T>
+            //It results in name as null. When null name in the class node gets deserialzed, as name is required filed in class hierarchy proto buffer schame,
+            //it causes exception during deserialization. The code below is to use first portion of AssemblyQualifiedName for the name of the node node in case type.name is null. 
+            string[] parts = GetAssemblyQualifiedName(name).Split(',');
+            return parts[0];
+        }
+
+        /// <summary>
+        /// Gets the interface target.
+        // Foo<T> ,  given Foo<T> and Foo return T
+        // example class Foo : Bar<U>, Bas<T>
+        // iface: Bar, type: Foo, return U
+        // iface: Bas, type: Foo, return T
+        // class ACons implements IExternalConstructor<A> 
+        // iface: IExternalConstructor<>, type: ACons return A
+        /// </summary>
+        /// <param name="iface">The iface.</param>
+        /// <param name="type">The type.</param>
+        /// <returns></returns>
+        public static Type GetInterfaceTarget(Type iface, Type type)
+        {
+            foreach (Type t in ReflectionUtilities.ClassAndAncestors(type))
+            {
+                if (IsGenericTypeof(iface, t))
+                {
+                    return t.GetGenericArguments()[0]; //verify it
+                }
+            }
+            return null;
+        }
+
+        public static Type GetInterfaceTargetForType(Type iface, Type type)
+        {
+            if (IsGenericTypeof(iface, type))
+            {
+                return type.GetGenericArguments()[0]; //verify it
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// Determines whether [is generic typeof] [the specified iface].
+        /// </summary>
+        /// <param name="iface">The iface.</param>
+        /// <param name="type">The type.</param>
+        /// <returns>
+        ///   <c>true</c> if [is generic typeof] [the specified iface]; otherwise, <c>false</c>.
+        /// </returns>
+        /// <exception cref="System.ApplicationException"></exception>
+        public static bool IsGenericTypeof(Type iface, Type type)
+        {
+            if (iface == null || type == null)
+            {
+                var ex = new ApplicationException(string.Format(CultureInfo.CurrentCulture,
+                                                             "The type passed in IsGenericTypeof is null: iface : {0} type: {1}. ",
+                                                             iface, type));
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+            }
+            if (type.IsGenericType)
+            {
+                if (GetAssemblyQualifiedName(iface).Equals(GetAssemblyQualifiedNameForGeneric(type)))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Classes the and ancestors.
+        /// </summary>
+        /// <param name="c">The c.</param>
+        /// <returns></returns>
+        public static IEnumerable<Type> ClassAndAncestors(Type c)
+        {
+            List<Type> workQueue = new List<Type>();
+            workQueue.Add(c); //including itself
+
+            foreach (Type t in c.GetInterfaces())
+            {
+                workQueue.Add(t);
+            }
+
+            Type b = c.BaseType;
+            while (b != null)
+            {
+                workQueue.Add(b);
+                b = b.BaseType;
+            }
+
+            if (c.IsInterface)
+            {
+                workQueue.Add(typeof (object));
+            }
+
+            return workQueue;
+        }
+
+        public static IEnumerable<Type> ClassAndAncestorsExcludeSelf(Type c)
+        {
+            List<Type> workQueue = new List<Type>();
+            //workQueue.Add(c); //including itself
+
+            foreach (Type t in c.GetInterfaces())
+            {
+                workQueue.Add(t);
+            }
+
+            Type b = c.BaseType;
+            while (b != null)
+            {
+                workQueue.Add(b);
+                b = b.BaseType;
+            }
+
+            if (c.IsInterface)
+            {
+                workQueue.Add(typeof(object));
+            }
+
+            return workQueue;
+        }
+
+        /// <summary>
+        /// Boxes the class.
+        /// </summary>
+        /// <param name="c">The c.</param>
+        /// <returns></returns>
+        /// <exception cref="System.NotSupportedException">Encountered unknown primitive type!</exception>
+        public static Type BoxClass(Type c)
+        {
+            if (c.IsPrimitive && c != typeof (Type))
+            {
+                if (c == typeof (bool))
+                {
+                    return typeof (Boolean);
+                }
+                else if (c == typeof (byte))
+                {
+                    return typeof (Byte);
+                }
+                else if (c == typeof (char))
+                {
+                    return typeof (Char);
+                }
+                else if (c == typeof (short))
+                {
+                    return typeof (Int16);
+                }
+                else if (c == typeof (int))
+                {
+                    return typeof (Int32);
+                }
+                else if (c == typeof (long))
+                {
+                    return typeof (Int64);
+                }
+                else if (c == typeof (float))
+                {
+                    return typeof (Single);
+                }
+                else if (c == typeof (double))
+                {
+                    return typeof (Double);
+                }
+                else
+                {
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new NotSupportedException(
+                        "Encountered unknown primitive type!"), LOGGER);
+                    return c;
+                }
+            }
+            else
+            {
+                return c;
+            }
+        }
+
+        /// <summary>
+        /// Determines whether the specified to is coercable.
+        //  public static boolean isCoercable(Class<?> to, Class<?> from) castable from to both are numbers and from has a few bits or subclass relationship
+        /// </summary>
+        /// <param name="to">To.</param>
+        /// <param name="from">From.</param>
+        /// <returns>
+        ///   <c>true</c> if the specified to is coercable; otherwise, <c>false</c>.
+        /// </returns>
+        public static bool IsCoercable(Type to, Type from)
+        {
+            to = BoxClass(to);
+            from = BoxClass(from);
+            //TODO
+            //if (Number.class.isAssignableFrom(to)
+            //    && Number.class.isAssignableFrom(from)) {
+            //return sizeof.get(from) <= sizeof.get(to);
+            return to.IsAssignableFrom(from);
+            //return IsAssignableFromIgnoreGeneric(to, from);
+        }
+
+        /// <summary>
+        /// Determines whether [is assignable from ignore generic] [the specified to].
+        /// </summary>
+        /// <param name="to">To.</param>
+        /// <param name="from">From.</param>
+        /// <returns>
+        ///   <c>true</c> if [is assignable from ignore generic] [the specified to]; otherwise, <c>false</c>.
+        /// </returns>
+        public static bool IsAssignableFromIgnoreGeneric(Type to, Type from)
+        {
+            var f = ClassAndAncestors(from);
+            foreach (Type t in f)
+            {
+                if (GetAssemblyQualifiedName(to).Equals(GetAssemblyQualifiedNameForGeneric(t)))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Ensures the type of the interface. For generic types, full name could be null. In this case, we need to 
+        /// get GetGenericTypeDefinition for the type so that to rerain all teh type information
+        /// </summary>
+        /// <param name="interf">The interf.</param>
+        /// <returns></returns>
+        public static Type EnsureInterfaceType(Type interf)
+        {
+            if (interf != null && interf.IsGenericType && null == interf.FullName)
+            {
+                return interf.GetGenericTypeDefinition(); //this is to test if this line is ever reached
+            }
+            return interf;
+        }
+
+        /// <summary>
+        /// Gets the assembly qualified name for generic.
+        /// </summary>
+        /// <param name="t">The t.</param>
+        /// <returns></returns>
+        public static string GetAssemblyQualifiedNameForGeneric(Type t)
+        {
+            Type t1 = t;
+            if (t.IsGenericType)
+            {
+                t1 = t.GetGenericTypeDefinition();
+            }
+            return t1.AssemblyQualifiedName;
+        }
+
+        /// <summary>
+        /// Determines whether [is instance of generic] [the specified p].
+        /// </summary>
+        /// <param name="p">The p.</param>
+        /// <param name="t">The t.</param>
+        /// <returns>
+        ///   <c>true</c> if [is instance of generic] [the specified p]; otherwise, <c>false</c>.
+        /// </returns>
+        public static bool IsInstanceOfGeneric(object p, Type t)
+        {
+            foreach (var g in ReflectionUtilities.ClassAndAncestors(p.GetType()))
+            {
+                if (GetAssemblyQualifiedNameForGeneric(t).Equals(GetAssemblyQualifiedNameForGeneric(g)))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// Gets the name of the type by.
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ApplicationException">Not able to get Type from the name provided:  +  name</exception>
+        public static Type GetTypeByName(string name)
+        {
+            Type t = null;
+
+            t = Type.GetType(name);
+
+            if (t == null)
+            {
+                foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
+                {
+                    t = a.GetType(name);
+                    if (t != null)
+                        break;
+                }
+            }
+            if (t == null)
+            {
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Not able to get Type from the name provided: " + name), LOGGER);
+            }
+
+            return t;
+        }
+
+        /// <summary>
+        /// Gets the enclosing classes.
+        /// </summary>
+        /// <param name="t">The t.</param>
+        /// <returns></returns>
+        public static Type[] GetEnclosingClasses(Type t)
+        {
+            IList<Type> l = new List<Type>();
+            l.Add(t);
+            Type current = t.DeclaringType;
+            while (current != null)
+            {
+                l.Add(current);
+                current = current.DeclaringType;
+            }
+            return l.Reverse().ToArray();
+        }
+
+        /// <summary>
+        /// Gets the enclosing class names.
+        /// </summary>
+        /// <param name="t">The t.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ApplicationException">The Type passed to GetEnclosingClassShortNames is null</exception>
+        public static string[] GetEnclosingClassNames(Type t)
+        {
+            if (t == null)
+            {
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("The Type passed to GetEnclosingClassShortNames is null"), LOGGER);
+            }
+            Type[] ts = GetEnclosingClasses(t);
+            string[] result = new string[ts.Length];
+            for (int i = 0; i < ts.Length; i++)
+            {
+                result[i] = GetAssemblyQualifiedName(ts[i]);
+            }
+
+            return result;
+        }
+
+        /// <summary>
+        /// Gets the enclosing class names.
+        /// </summary>
+        /// <param name="fullName">The full name.</param>
+        /// <returns></returns>
+        /// <exception cref="System.ApplicationException">The name passed to GetEnclosingClassShortNames is null</exception>
+        public static string[] GetEnclosingClassNames(string fullName)
+        {
+            if (fullName == null)
+            {
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("The name passed to GetEnclosingClassShortNames is null"), LOGGER);
+            }
+            Type t = ReflectionUtilities.GetTypeByName(fullName);
+            return GetEnclosingClassNames(t);
+        }
+
+        /// <summary>
+        /// Gets the named parameter target or null.
+        /// </summary>
+        /// <param name="type">The type.</param>
+        /// <returns></returns>
+        /// <exception cref="ClassHierarchyException">Named parameter  + GetName(type) +  implements 
+        ///                                   + multiple interfaces.  It is only allowed to implement Name</exception>
+        public static Type GetNamedParameterTargetOrNull(Type type)
+        {
+            var npAnnotation = type.GetCustomAttribute<NamedParameterAttribute>();
+            if (npAnnotation != null)
+            {
+                Type[] intfs = type.GetInterfaces();
+                if (intfs.Length > 1)
+                {
+                    var ex = new ClassHierarchyException("Named parameter " + GetName(type) + " implements "
+                                  + "multiple interfaces.  It is only allowed to implement Name<T>");
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+
+                }
+                else if (intfs.Length == 0 || !IsName(intfs[0]))
+                {
+                    var ex = new ClassHierarchyException("Found illegal [NamedParameter " + GetName(type)
+                                  + " does not implement Name<T>");
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                Type[] args = intfs[0].GetGenericArguments();
+                if (args.Length > 1)
+                {
+                    var ex = new ClassHierarchyException("Found illegal [NamedParameter " + GetName(type)
+                        + " that has more than one arguments");
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                if (args.Length == 0)
+                {
+                    var ex = new ClassHierarchyException("Found illegal [NamedParameter " + GetName(type)
+                        + " that has no argument");
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+                if (HasConstructor(type) || HasInjectableConstructor(type))
+                {
+                    var ex = new ClassHierarchyException("Named parameter " + GetName(type) + " has "
+                                  + (HasInjectableConstructor(type) ? "an injectable" : "a") + " constructor. "
+                                  + " Named parameters must not declare any constructors.");
+                    Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+                }
+
+                return args[0];               
+            }
+
+            if (ImplementName(type)) //Implement Name<> but no  [NamedParameter] attribute
+            {
+                var ex = new ClassHierarchyException("Named parameter " + GetName(type)
+                                  + " is missing its [NamedParameter] attribute.");
+                Org.Apache.REEF.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+            }
+            return null;
+        }
+
+        public static IEnumerable<Type> GetInterfaces(Type type, bool includeInherited)
+        {
+            if (includeInherited || type.BaseType == null)
+                return type.GetInterfaces();
+            else
+                return type.GetInterfaces().Except(type.BaseType.GetInterfaces());
+        }
+
+        // Here is a more elaborate hack to test for annonymous type:
+        // http://stackoverflow.com/questions/2483023/how-to-test-if-a-type-is-anonymous
+        // compiler generated classes are always recreatable and need not additional references to check for.
+        public static bool IsAnnonymousType(Type type)
+        {
+            if (type != null)
+            {
+                // HACK: The only way to detect anonymous types right now.
+                return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
+                       && type.IsGenericType && type.Name.Contains("AnonymousType")
+                       && (type.Name.StartsWith("<>", true, CultureInfo.CurrentCulture) || type.Name.StartsWith("VB$", true, CultureInfo.CurrentCulture))
+                       && (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic;
+            }
+            return false;
+        }
+
+        private static bool ImplementName(Type type)
+        {
+            foreach (Type t in type.GetInterfaces())
+            {
+                if (IsName(t))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private static bool IsName(Type t)
+        {
+            if (t.IsGenericType)
+            {
+                return t.GetGenericTypeDefinition().AssemblyQualifiedName.Equals(typeof (Name<>).AssemblyQualifiedName);
+            }
+            return false;
+        }
+
+        private static bool HasConstructor(Type type)
+        {
+            bool hasConstructor = false;
+
+            ConstructorInfo[] constructors =
+                type.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+            if (constructors.Length > 1)
+            {
+                hasConstructor = true;
+            }
+
+            if (constructors.Length == 1)
+            {
+                ConstructorInfo c = constructors[0];
+                ParameterInfo[] p = c.GetParameters();
+                if (p.Length > 1)
+                {
+                    // Multiple args. Definitely not implicit.
+                    hasConstructor = true;
+                }
+                else if (p.Length == 1)
+                {
+                    // One arg. Could be an inner class, in which case the compiler
+                    // included an implicit one parameter constructor that takes the
+                    // enclosing type.
+                    if (p[0].ParameterType != type.DeclaringType)
+                    {
+                        hasConstructor = true;
+                    }
+                }
+            }
+            return hasConstructor;
+        }
+
+        private static bool HasInjectableConstructor(Type type)
+        {
+            bool isInjectable = false;
+
+            ConstructorInfo[] constructors =
+                type.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+
+            foreach (ConstructorInfo c in constructors)
+            {
+                foreach (Attribute a in c.GetCustomAttributes())
+                {
+                    if (a is InjectAttribute)
+                    {
+                        isInjectable = true;
+                    }
+                }
+            }
+            return isInjectable;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Util/SetValuedKey.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/Util/SetValuedKey.cs b/lang/cs/Org.Apache.REEF.Tang/Util/SetValuedKey.cs
new file mode 100644
index 0000000..5d146cb
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/Util/SetValuedKey.cs
@@ -0,0 +1,62 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Org.Apache.REEF.Tang.Util
+{
+    class SetValuedKey
+    {
+        public IList<object> key;
+
+        public SetValuedKey(object[] ts, object[] us)
+        {
+            key = ts.ToList<object>();
+            foreach (var o in us)
+            {
+                key.Add(o);
+            }
+        }
+
+        public override int GetHashCode()
+        {
+            int i = 0;
+            foreach (object t in key)
+            {
+                i += t.GetHashCode();
+            }
+            return i;
+        }
+
+        public override bool Equals(Object o)
+        {
+            SetValuedKey other = (SetValuedKey)o;
+            if (other.key.Count != this.key.Count) { return false; }
+            for (int i = 0; i < this.key.Count; i++)
+            {
+                if (this.key[i].Equals(other.key[i]))
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/packages.config
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Tang/packages.config b/lang/cs/Org.Apache.REEF.Tang/packages.config
new file mode 100644
index 0000000..933b7e1
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Tang/packages.config
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<packages>
+  <package id="Microsoft.Hadoop.Avro" version="1.4.0.0" targetFramework="net45" />
+  <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
+  <package id="protobuf-net" version="2.0.0.668" targetFramework="net45" />
+</packages>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/AvroUtils.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/AvroUtils.cs b/lang/cs/Org.Apache.REEF.Utilities/AvroUtils.cs
new file mode 100644
index 0000000..7a92b49
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/AvroUtils.cs
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Hadoop.Avro;
+
+namespace Org.Apache.REEF.Utilities
+{
+    public class AvroUtils
+    {
+        /// <summary>
+        /// Convert an object to byte array using Avro serializiation
+        /// </summary>
+        /// <param name="obj">The object to serialize</param>
+        /// <returns>The serialized object in a byte array</returns>
+        public static byte[] AvroSerialize<T>(T obj)
+        {
+            IAvroSerializer<T> serializer = AvroSerializer.Create<T>();
+            using (MemoryStream stream = new MemoryStream())
+            {
+                serializer.Serialize(stream, obj);
+                return stream.GetBuffer();
+            }
+        }
+
+        /// <summary>
+        /// Converts a byte array to an object using Avro deserialization.
+        /// </summary>
+        /// <param name="data">The byte array to deserialize</param>
+        /// <returns>The deserialized object</returns>
+        public static T AvroDeserialize<T>(byte[] data)
+        {
+            IAvroSerializer<T> deserializer = AvroSerializer.Create<T>();
+            using (MemoryStream stream = new MemoryStream(data))
+            {
+                return deserializer.Deserialize(stream);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/ByteUtilities.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/ByteUtilities.cs b/lang/cs/Org.Apache.REEF.Utilities/ByteUtilities.cs
new file mode 100644
index 0000000..e7c71f4
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/ByteUtilities.cs
@@ -0,0 +1,45 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Text;
+
+namespace Org.Apache.REEF.Utilities
+{
+    public class ByteUtilities
+    {
+        public static byte[] StringToByteArrays(string s)
+        {
+            return Encoding.UTF8.GetBytes(s);
+        }
+
+        public static string ByteArrarysToString(byte[] b)
+        {
+            return Encoding.UTF8.GetString(b);
+        }
+
+        public static byte[] CopyBytesFrom(byte[] from)
+        {
+            int length = Buffer.ByteLength(from);
+            byte[] to = new byte[length];
+            Buffer.BlockCopy(from, 0, to, 0, length);
+            return to;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/DiagnosticsMessages.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/DiagnosticsMessages.cs b/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/DiagnosticsMessages.cs
new file mode 100644
index 0000000..165c54c
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/DiagnosticsMessages.cs
@@ -0,0 +1,42 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Org.Apache.REEF.Utilities.Diagnostics
+{
+    public class DiagnosticsMessages
+    {
+        public const string ExceptionThrowing = "ExceptionThrowing";
+
+        public const string ExceptionCaught = "ExceptionCaught";
+
+        public const string DumperTimeout = "DumperTimeout";
+
+        public const string DumperError = "DumperError";
+
+        public const string CallingDumper = "CallingDumper";
+
+        public const string DumperException = "DumperException";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/Exceptions.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/Exceptions.cs b/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/Exceptions.cs
new file mode 100644
index 0000000..035fdbe
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/Diagnostics/Exceptions.cs
@@ -0,0 +1,282 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+using System;
+using System.Globalization;
+using System.Text;
+using Org.Apache.REEF.Utilities.Logging;
+
+namespace Org.Apache.REEF.Utilities.Diagnostics
+{
+    public static class Exceptions
+    {
+        #region methods
+        /// <summary>
+        /// Call this method to throw an exception.
+        /// </summary>
+        /// <remarks>
+        /// Calling this method will trace the exception and do other common processing, 
+        /// and then it will throw the exception. This method traces the exception type 
+        /// and message at error level and the full stack trace at all other levels.
+        /// </remarks>
+        /// <example>
+        ///     Exceptions.Throw(new Exception("Some exception"));
+        /// </example>
+        /// <param name="exception">The exception to be thrown.</param>
+        /// <param name="message">The message from the caller class.</param>
+        /// <param name="logger">The logger from the caller class.</param>
+        public static void Throw(Exception exception, string message, Logger logger)
+        {
+            string logMessage = string.Concat(DiagnosticsMessages.ExceptionThrowing, " ", exception.GetType().Name, " ", message);
+            if (logger == null)
+            {
+                Console.WriteLine("Exception caught before logger is initiated, error message: " + logMessage + exception.Message);
+            }
+            else
+            {
+                logger.Log(Level.Error, logMessage, exception);
+            }
+            throw exception;
+        }
+
+        /// <summary>
+        /// Call this method to throw an exception.
+        /// </summary>
+        /// <remarks>
+        /// Calling this method will trace the exception and do other common processing, 
+        /// and then it will throw the exception. This method traces the exception type 
+        /// and message at error level and the full stack trace at all other levels.
+        /// </remarks>
+        /// <example>
+        ///     Exceptions.Throw(new Exception("Some exception"));
+        /// </example>
+        /// <param name="exception">The exception to be thrown.</param>
+        /// <param name="logger">The logger of the caller class.</param>
+        public static void Throw(Exception exception, Logger logger)
+        {
+            Throw(exception, string.Empty, logger);
+        }
+
+        /// <summary>
+        /// Call this method every time when an exception is caught.
+        /// </summary>
+        /// <remarks>
+        /// Calling this method will trace the exception and do other common processing.
+        /// This method traces the exception type and message at error level and the full
+        /// stack trace at all other levels.
+        /// </remarks>
+        /// <example>
+        ///     try
+        ///     {
+        ///         // Some code that can throw
+        ///     }
+        ///     catch (Exception e)
+        ///     {
+        ///         Exceptions.Caught(e);
+        ///         // Exception handling code
+        ///     }
+        /// </example>
+        /// <param name="exception">The exception being caught.</param>
+        /// <param name="level">The log level.</param>
+        /// <param name="logger">The logger from the caller class.</param>
+        public static void Caught(Exception exception, Level level, Logger logger)
+        {
+            Caught(exception, level, string.Empty, logger);
+        }
+
+        /// <summary>
+        /// Call this method every time when an exception is caught.
+        /// </summary>
+        /// <remarks>
+        /// Calling this method will trace the exception and do other common processing.
+        /// This method traces the exception type and message at error level and the full
+        /// stack trace at all other levels.
+        /// </remarks>
+        /// <example>
+        ///     try
+        ///     {
+        ///         // Some code that can throw
+        ///     }
+        ///     catch (Exception e)
+        ///     {
+        ///         Exceptions.Caught(e);
+        ///         // Exception handling code
+        ///     }
+        /// </example>
+        /// <param name="exception">The exception being caught.</param>
+        /// <param name="level">The log level.</param>
+        /// <param name="message">The additional messag to log.</param>
+        /// <param name="logger">The Logger from the caller class.</param>
+        public static void Caught(Exception exception, Level level, string message, Logger logger)
+        {
+            string logMessage = string.Concat(DiagnosticsMessages.ExceptionCaught, " ", exception.GetType().Name, " ", message);
+            if (logger == null)
+            {
+                Console.WriteLine("Exception caught before logger is initiated, error message: " + logMessage + exception.Message);
+            }
+            else
+            {
+                logger.Log(level, logMessage, exception);
+            }
+        }
+
+        public static void CaughtAndThrow(Exception exception, Level level, Logger logger)
+        {
+            CaughtAndThrow(exception, level, string.Empty, logger);
+        }
+
+        public static void CaughtAndThrow(Exception exception, Level level, string message, Logger logger)
+        {
+            string logMessage = string.Concat(DiagnosticsMessages.ExceptionCaught, " ", exception.GetType().Name, " ", message);
+            if (logger == null)
+            {
+                Console.WriteLine("Exception caught before logger is initiated, error message: " + logMessage + exception.Message);
+            }
+            else
+            {
+                logger.Log(level, logMessage, exception);
+            }
+            throw exception;
+        }
+
+        /// <summary>
+        /// This method returns true if the exception passed as parameter is a critical exception
+        /// that should have not been caught. Examples for such exceptions are StackOverflowException
+        /// and OutOfMemoryException.
+        /// </summary>
+        /// <remarks>
+        /// Catch statements which catch all exceptions must call this method immediately and rethrow
+        /// wihtout further processing if the method returns true.
+        /// </remarks>
+        /// <example>
+        /// try
+        /// {
+        ///     // Some code that can throw
+        /// }
+        /// catch (Exception e)
+        /// {
+        ///     if (Exceptions.MustRethrow(e))
+        ///     {
+        ///         throw;
+        ///     }
+        ///     // Exception handling code
+        /// }
+        /// </example>
+        /// <param name="exception">The exception to be checked.</param>
+        /// <returns>True if the exceptions is critical one and should not be caught and false otherwise.</returns>
+        public static bool MustRethrow(Exception exception)
+        {
+            return (exception is OutOfMemoryException ||
+                    exception is StackOverflowException);
+        }
+
+        /// <summary>
+        /// Gets an exception message that includes the messages of the inner exceptions..
+        /// </summary>
+        /// <param name="e">The excption.</param>
+        /// <returns>The meessage</returns>
+        public static string GetFullMessage(Exception e)
+        {
+            var fullMessage = new StringBuilder();
+            bool firstLevel = true;
+            while (e != null)
+            {
+                if (firstLevel)
+                {
+                    firstLevel = false;
+                }
+                else
+                {
+                    fullMessage.Append("-->");
+                }
+                fullMessage.Append(e.Message);
+                e = e.InnerException;
+            }
+
+            return fullMessage.ToString();
+        }
+
+        /// <summary>
+        /// Call this method to throw ArgumentException for an invalid argument.
+        /// </summary>
+        /// <param name="argumentName">The invalid argument name.</param>
+        /// <param name="message">A message explaining the reason for th exception.</param>
+        /// <param name="logger">The logger of the caller class.</param>
+        public static void ThrowInvalidArgument(string argumentName, string message, Logger logger)
+        {
+            Throw(new ArgumentException(message, argumentName), logger);
+        }
+
+        /// <summary>
+        /// Call this method to throw ArgumentOutOfRangeException exception.
+        /// </summary>
+        /// <param name="argumentName">The invalid argument name.</param>
+        /// <param name="message">A message explaining the reason for th exception.</param>
+        /// <param name="logger">The logger of the caller class.</param>
+        public static void ThrowArgumentOutOfRange(string argumentName, string message, Logger logger)
+        {
+            Throw(new ArgumentOutOfRangeException(argumentName, message), logger);
+        }
+
+        /// <summary>
+        /// Call this method to check if an argument is null and throw ArgumentNullException exception.
+        /// </summary>
+        /// <param name="argument">The argument to be checked.</param>
+        /// <param name="name">The name of the argument.</param>
+        /// <param name="logger">The logger of the caller class.</param>
+        public static void ThrowIfArgumentNull(object argument, string name, Logger logger)
+        {
+            if (argument == null)
+            {
+                Exceptions.Throw(new ArgumentNullException(name), logger);
+            }
+        }
+
+        /// <summary>
+        /// Call this method to throw ObjectDisposedException if an object is disposed.
+        /// </summary>
+        /// <remarks>
+        /// All disposable objects should check their state and throw in the beginning of each public method.
+        /// This helper method provides a shorter way to do this.
+        /// </remarks>
+        /// <example>
+        /// class SomeClass : IDisposable
+        /// {
+        ///     bool _disposed;
+        ///     // ...
+        ///     public void SomePublicMethod()
+        ///     {
+        ///         Exceptions.ThrowIfObjectDisposed(_disposed, this);
+        ///         // Method's code
+        ///     }
+        /// }
+        /// </example>
+        /// <param name="disposed">True if the object is disposed.</param>
+        /// <param name="o">The object.</param>
+        /// <param name="logger">The logger of the caller class.</param>
+        public static void ThrowIfObjectDisposed(bool disposed, object o, Logger logger)
+        {
+            if (disposed)
+            {
+                Throw(new ObjectDisposedException(o.GetType().Name), logger);
+            }
+        }
+        #endregion
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/IIdentifiable.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/IIdentifiable.cs b/lang/cs/Org.Apache.REEF.Utilities/IIdentifiable.cs
new file mode 100644
index 0000000..532349c
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/IIdentifiable.cs
@@ -0,0 +1,26 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace Org.Apache.REEF.Utilities
+{
+    public interface IIdentifiable
+    {
+        string Id { get; set; }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/IMessage.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/IMessage.cs b/lang/cs/Org.Apache.REEF.Utilities/IMessage.cs
new file mode 100644
index 0000000..97c4f60
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/IMessage.cs
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace Org.Apache.REEF.Utilities
+{
+    /// <summary>
+    /// A message from a REEF component
+    /// </summary>
+    public interface IMessage
+    {
+        /// <summary>
+        ///  Get Message payload
+        /// </summary>
+        /// <returns></returns>
+        byte[] Message { get; }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/Logging/JavaLoggingSetting.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/Logging/JavaLoggingSetting.cs b/lang/cs/Org.Apache.REEF.Utilities/Logging/JavaLoggingSetting.cs
new file mode 100644
index 0000000..3b26c34
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/Logging/JavaLoggingSetting.cs
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace Org.Apache.REEF.Utilities.Logging
+{
+    public enum JavaLoggingSetting
+    {
+         /// <summary>
+        /// info level log, and not transferred to CLR 
+        /// </summary>
+        INFO = 0,
+
+        /// <summary>
+        /// verbose log, but not to CLR
+        /// </summary>
+        VERBOSE = 1,
+
+        /// <summary>
+        /// verbose log, transferred to CLR
+        /// </summary>
+        VERBOSE_TO_CLR = 2,
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Utilities/Logging/Level.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Org.Apache.REEF.Utilities/Logging/Level.cs b/lang/cs/Org.Apache.REEF.Utilities/Logging/Level.cs
new file mode 100644
index 0000000..3c47e59
--- /dev/null
+++ b/lang/cs/Org.Apache.REEF.Utilities/Logging/Level.cs
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+namespace Org.Apache.REEF.Utilities.Logging
+{
+    public enum Level
+    {
+        /// <summary>
+        /// Output no tracing and debugging messages.
+        /// </summary>
+        Off = 0,
+
+        /// <summary>
+        /// Output error-handling messages.
+        /// </summary>
+        Error = 1,
+
+        /// <summary>
+        /// Output warnings and error-handling messages.
+        /// </summary>
+        Warning = 2,
+
+        /// <summary>
+        /// Trace a start event
+        /// </summary>
+        Start = 3,
+
+        /// <summary>
+        /// Trace a stop event
+        /// </summary>
+        Stop = 4,
+
+        /// <summary>
+        /// Output informational messages, warnings, and error-handling messages.
+        /// </summary>
+        Info = 5,
+
+        /// <summary>
+        /// Output all debugging and tracing messages.
+        /// </summary>
+        Verbose = 6,
+    }
+}