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/01/29 21:42:59 UTC
[15/31] incubator-reef git commit: [REEF-97] Add the REEF.NET code
base
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/Configuration/Configurations.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/Configuration/Configurations.cs b/lang/cs/Source/TANG/Tang/Implementations/Configuration/Configurations.cs
new file mode 100644
index 0000000..c61fbd7
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/Configuration/Configurations.cs
@@ -0,0 +1,55 @@
+/**
+ * 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 Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Protobuf;
+
+namespace Org.Apache.Reef.Tang.Implementations.Configuration
+{
+ public class Configurations
+ {
+ public static IConfiguration Merge(params IConfiguration[] configurations)
+ {
+ return TangFactory.GetTang().NewConfigurationBuilder(configurations).Build();
+ }
+
+ public static IConfiguration MergeDeserializedConfs(params IConfiguration[] configurations)
+ {
+ IClassHierarchy ch;
+
+ if (configurations != null && configurations.Length > 0)
+ {
+ ch = configurations[0].GetClassHierarchy();
+ }
+ else
+ {
+ ch = new ProtocolBufferClassHierarchy();
+ }
+
+ IConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder(ch);
+
+ foreach (IConfiguration tc in configurations)
+ {
+ cb.AddConfiguration(((ConfigurationImpl)tc));
+ }
+
+ return cb.Build();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationBuilderImpl.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationBuilderImpl.cs b/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationBuilderImpl.cs
new file mode 100644
index 0000000..70ff1b7
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationBuilderImpl.cs
@@ -0,0 +1,489 @@
+/**
+ * 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;
+using System.Collections.Generic;
+using System.Globalization;
+using Org.Apache.Reef.Utilities.Logging;
+using Org.Apache.Reef.Tang.Annotations;
+using Org.Apache.Reef.Tang.Exceptions;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Types;
+using Org.Apache.Reef.Tang.Util;
+
+namespace Org.Apache.Reef.Tang.Implementations
+{
+ public class CsConfigurationBuilderImpl : ConfigurationBuilderImpl, ICsInternalConfigurationBuilder
+ {
+ private static readonly Logger LOGGER = Logger.GetLogger(typeof(CsConfigurationBuilderImpl));
+
+ #region Constructors
+ public CsConfigurationBuilderImpl(string[] assemblies, IConfiguration[] confs, Type[] parsers) : base(assemblies,confs,parsers)
+ {
+ }
+
+ public CsConfigurationBuilderImpl(IConfiguration[] confs) : base(confs)
+ {
+ }
+
+ public CsConfigurationBuilderImpl(CsConfigurationBuilderImpl impl) : base(impl)
+ {
+ }
+
+ public CsConfigurationBuilderImpl(ICsClassHierarchy classHierarchy)
+ : base(classHierarchy)
+ {
+ }
+
+ public CsConfigurationBuilderImpl(string[] assemblies)
+ : base(assemblies)
+ {
+ }
+ #endregion Constructors
+
+ #region ICsConfigurationBuilder
+ /// <summary>
+ /// Builds this instance.
+ /// </summary>
+ /// <returns></returns>
+ public CsConfigurationImpl build()
+ {
+ return new CsConfigurationImpl(new CsConfigurationBuilderImpl(this));
+ }
+
+ /// <summary>
+ /// Binds a string to a named parameter.
+ /// </summary>
+ /// <param name="name">The name.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ /// <exception cref="BindException">Detected type mismatch when setting named parameter + name
+ /// + Expected NamedParameterNode, but namespace contains a + np</exception>
+ public ICsConfigurationBuilder BindNamedParameter(Type name, string value)
+ {
+ if (value == null)
+ {
+ var ex = new IllegalStateException(string.Format(CultureInfo.CurrentCulture, "The value null set to the named parameter {0} is illegel.", name));
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ INode np = GetNode(name);
+ if (np is INamedParameterNode)
+ {
+ BindParameter((INamedParameterNode)np, value);
+ }
+ else
+ {
+ var ex = new BindException(
+ "Detected type mismatch when setting named parameter " + name
+ + " Expected NamedParameterNode, but namespace contains a " + np);
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ return this;
+ }
+
+ /// <summary>
+ /// Binds the class impl as the implementation of the interface iface
+ /// </summary>
+ /// <param name="iface">The iface.</param>
+ /// <param name="impl">The impl.</param>
+ /// <returns></returns>
+ public ICsConfigurationBuilder BindImplementation(Type iface, Type impl)
+ {
+ INode cn = GetNode(iface);
+ INode dn = GetNode(impl);
+ if (!(cn is IClassNode))
+ {
+ var ex = new BindException(
+ "bindImplementation passed interface that resolved to " + cn
+ + " expected a ClassNode<?>");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ if (!(dn is IClassNode))
+ {
+ var ex = new BindException(
+ "bindImplementation passed implementation that resolved to " + dn
+ + " expected a ClassNode<?>");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ BindImplementation((IClassNode)cn, (IClassNode)dn);
+ return this;
+ }
+
+ /// <summary>
+ /// Binds the implementation to the interface
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="iface">The iface.</param>
+ /// <param name="impl">The impl.</param>
+ /// <returns></returns>
+ public ICsConfigurationBuilder BindImplementation<U, T>(GenericType<U> iface, GenericType<T> impl)
+ where T : U
+ {
+ return BindImplementation(typeof(U), typeof(T));
+ }
+
+ /// <summary>
+ /// Binds a value to a named parameter.
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="name">The name.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ public ICsConfigurationBuilder BindNamedParameter<U, T>(GenericType<U> name, string value)
+ where U : Name<T>
+ {
+ return BindNamedParameter(typeof(U), value);
+ }
+
+ /// <summary>
+ /// Binds an implementaion to a named parameter.
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <typeparam name="V"></typeparam>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="iface">The iface.</param>
+ /// <param name="impl">The impl.</param>
+ /// <returns></returns>
+ public ICsConfigurationBuilder BindNamedParameter<U, V, T>(GenericType<U> iface, GenericType<V> impl)
+ where U : Name<T>
+ where V : T
+ {
+ return ((ICsInternalConfigurationBuilder)this).BindNamedParameter(typeof(U), typeof(V));
+ }
+
+ /// <summary>
+ /// Binds an external constructor.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <typeparam name="U"></typeparam>
+ /// <param name="c">The c.</param>
+ /// <param name="v">The v.</param>
+ /// <returns></returns>
+ public ICsConfigurationBuilder BindConstructor<T, U>(GenericType<T> c, GenericType<U> v)
+ where U : IExternalConstructor<T>
+ {
+ return ((ICsInternalConfigurationBuilder)this).BindConstructor(typeof(T), typeof(U));
+ }
+
+ //public <T> void bindSetEntry(Class<? extends Name<Set<T>>> iface, String value) throws BindException;
+ /// <summary>
+ /// Binds a string value to a named parameter of ISet.
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="iface">The iface.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ public ICsConfigurationBuilder BindSetEntry<U, T>(GenericType<U> iface, string value)
+ where U : Name<ISet<T>>
+ {
+ return ((ICsInternalConfigurationBuilder)this).BindSetEntry(typeof(U), value);
+ }
+
+ //public <T> void bindSetEntry(Class<? extends Name<Set<T>>> iface, Class<? extends T> impl) throws BindException;
+ /// <summary>
+ /// Binds an implementaion of T to a named parameter of ISet of T.
+ /// </summary>
+ /// <typeparam name="U"></typeparam>
+ /// <typeparam name="V"></typeparam>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="iface">The iface.</param>
+ /// <param name="impl">The impl.</param>
+ /// <returns></returns>
+ public ICsConfigurationBuilder BindSetEntry<U, V, T>(GenericType<U> iface, GenericType<V> impl)
+ where U : Name<ISet<T>>
+ where V : T
+ {
+ return ((ICsInternalConfigurationBuilder)this).BindSetEntry(typeof(U), typeof(V));
+ }
+
+ public ICsConfigurationBuilder BindList<U, V, T>(GenericType<U> iface, IList<GenericType<V>> impl)
+ where U : Name<IList<T>>
+ where V : T
+ {
+ IList<Type> implTypes = new List<Type>();
+ foreach (var item in impl)
+ {
+ implTypes.Add(item.TypeT);
+ }
+ return ((ICsInternalConfigurationBuilder)this).BindList(typeof(U), implTypes);
+ }
+
+ public ICsConfigurationBuilder BindList<U, T>(GenericType<U> iface, IList<string> impl)
+ where U : Name<IList<T>>
+ {
+ return ((ICsInternalConfigurationBuilder)this).BindList(typeof(U), impl);
+ }
+
+ public ICsConfigurationBuilder BindList(Type iface, IList<Type> implList)
+ {
+ INode n = GetNode(iface);
+ IList<INode> result = new List<INode>();
+
+ if (!(n is INamedParameterNode))
+ {
+ var ex = new BindException("BindList got an interface that resolved to " + n + "; expected a NamedParameter");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ Type listType = ReflectionUtilities.GetInterfaceTarget(typeof(Name<>), iface);
+ if (!ReflectionUtilities.IsGenericTypeof(typeof(IList<>), listType))
+ {
+ var ex = new BindException("BindList got a NamedParameter that takes a " + listType + "; expected List<...>");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ if (implList != null && implList.Count > 0)
+ {
+ Type valType = ReflectionUtilities.GetInterfaceTarget(typeof(IList<>), listType);
+
+ foreach (var item in implList)
+ {
+ if (!valType.IsAssignableFrom((Type)item))
+ {
+ var ex =
+ new BindException("BindList got implementation " + item +
+ " that is incompatible with expected type " + valType);
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ result.Add(GetNode(item));
+ }
+ }
+
+ BindList((INamedParameterNode)n, result);
+ return this;
+ }
+ #endregion ICsConfigurationBuilder
+
+ #region ICsInternalConfigurationBuilder
+ /// <summary>
+ /// Bind named parameters, implementations or external constructors, depending
+ /// on the types of the classes passed in.
+ /// </summary>
+ /// <param name="iface">The iface.</param>
+ /// <param name="impl">The impl.</param>
+ /// <returns></returns>
+ ICsInternalConfigurationBuilder ICsInternalConfigurationBuilder.Bind(Type iface, Type impl)
+ {
+ Bind(GetNode(iface), GetNode(impl));
+ return this;
+ }
+
+ /// <summary>
+ /// Binds an implementation for a named parameter.
+ /// </summary>
+ /// <param name="iface">The iface.</param>
+ /// <param name="impl">The impl.</param>
+ /// <returns></returns>
+ /// <exception cref="BindException">Type mismatch when setting named parameter + ifaceN
+ /// + Expected NamedParameterNode</exception>
+ ICsInternalConfigurationBuilder ICsInternalConfigurationBuilder.BindNamedParameter(Type iface, Type impl)
+ {
+ INode ifaceN = GetNode(iface);
+ INode implN = GetNode(impl);
+ if (!(ifaceN is INamedParameterNode))
+ {
+ var ex = new BindException("Type mismatch when setting named parameter " + ifaceN
+ + " Expected NamedParameterNode");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ Bind(ifaceN, implN);
+ return this;
+ }
+
+ //public <T> void bindSetEntry(Class<? extends Name<Set<T>>> iface, String value) throws BindException;
+ /// <summary>
+ /// Binds a string value to to a named parameter of ISet entry
+ /// </summary>
+ /// <param name="iface">The iface.</param>
+ /// <param name="value">The value.</param>
+ /// <returns></returns>
+ /// <exception cref="BindException">BindSetEntry got an interface that resolved to + n + ; expected a NamedParameter</exception>
+ ICsInternalConfigurationBuilder ICsInternalConfigurationBuilder.BindSetEntry(Type iface, string value)
+ {
+ INode n = GetNode(iface);
+
+ if (!(n is INamedParameterNode))
+ {
+ var ex = new BindException("BindSetEntry got an interface that resolved to " + n + "; expected a NamedParameter");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ Type setType = ReflectionUtilities.GetInterfaceTarget(typeof(Name<>), iface);
+
+ //check if setType is ISet
+ if (ReflectionUtilities.GetInterfaceTarget(typeof(ISet<>), setType) == null)
+ {
+ var ex = new BindException("BindSetEntry got a NamedParameter that takes a " + setType + "; expected Set<...>");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ // Type valType = ReflectionUtilities.getInterfaceTarget(Set.class, setType);
+ BindSetEntry((INamedParameterNode)n, value);
+ return this;
+ }
+
+ //public <T> void bindSetEntry(Class<? extends Name<Set<T>>> iface, Class<? extends T> impl) throws BindException;
+ /// <summary>
+ /// Binds an implementaion to a named parameter of ISset entry.
+ /// </summary>
+ /// <param name="iface">The iface.</param>
+ /// <param name="impl">The impl.</param>
+ /// <returns></returns>
+ /// <exception cref="BindException">BindSetEntry got an interface that resolved to + n + ; expected a NamedParameter</exception>
+ ICsInternalConfigurationBuilder ICsInternalConfigurationBuilder.BindSetEntry(Type iface, Type impl)
+ {
+ INode n = GetNode(iface);
+ INode m = GetNode(impl);
+
+ if (!(n is INamedParameterNode))
+ {
+ var ex = new BindException("BindSetEntry got an interface that resolved to " + n + "; expected a NamedParameter");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ Type setType = ReflectionUtilities.GetInterfaceTarget(typeof(Name<>), iface);
+
+ //if (!ReflectionUtilities.GetRawClass(setType).Equals(typeof(ISet<>)))
+ if (!ReflectionUtilities.IsGenericTypeof(typeof(ISet<>), setType))
+ {
+ var ex = new BindException("BindSetEntry got a NamedParameter that takes a " + setType + "; expected Set<...>");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ Type valType = ReflectionUtilities.GetInterfaceTarget(typeof(ISet<>), setType);
+
+ if (!valType.IsAssignableFrom(impl))
+ //if (!ReflectionUtilities.GetRawClass(valType).IsAssignableFrom(impl))
+ {
+ var ex = new BindException("BindSetEntry got implementation " + impl + " that is incompatible with expected type " + valType);
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ BindSetEntry((INamedParameterNode)n, m);
+ return this;
+ }
+
+ ICsInternalConfigurationBuilder ICsInternalConfigurationBuilder.BindList(Type iface, IList<string> implList)
+ {
+ INode n = GetNode(iface);
+
+ if (!(n is INamedParameterNode))
+ {
+ var ex = new BindException("BindList got an interface that resolved to " + n + "; expected a NamedParameter");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ Type listType = ReflectionUtilities.GetInterfaceTarget(typeof(Name<>), iface);
+ if (!ReflectionUtilities.IsGenericTypeof(typeof(IList<>), listType))
+ {
+ var ex = new BindException("BindList got a NamedParameter that takes a " + listType + "; expected List<...>");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ BindList((INamedParameterNode)n, implList);
+ return this;
+ }
+
+ //public <T> void bindConstructor(Class<T> c, Class<? extends ExternalConstructor<? extends T>> v) throws BindException;
+ /// <summary>
+ /// Binds an external constructor.
+ /// </summary>
+ /// <param name="c">The c.</param>
+ /// <param name="v">The v.</param>
+ /// <returns></returns>
+ /// <exception cref="BindException">BindConstructor got class that resolved to + n + ; expected ClassNode</exception>
+ ICsInternalConfigurationBuilder ICsInternalConfigurationBuilder.BindConstructor(Type c, Type v)
+ {
+ INode n = GetNode(c);
+ INode m = GetNode(v);
+
+ if (!(n is IClassNode))
+ {
+ var ex = new BindException("BindConstructor got class that resolved to " + n + "; expected ClassNode");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ if (!(m is IClassNode))
+ {
+ var ex = new BindException("BindConstructor got class that resolved to " + m + "; expected ClassNode");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+ BindConstructor((IClassNode)n, (IClassNode)m);
+ return this;
+ }
+ #endregion ICsInternalConfigurationBuilder
+
+ #region extension methods
+
+ public ICsConfigurationBuilder BindNamedParam<TName, TType>(string str) where TName : Name<TType>
+ {
+ return BindNamedParameter<TName, TType>(GenericType<TName>.Class, str);
+ }
+
+ public ICsConfigurationBuilder BindStringNamedParam<T>(string str) where T : Name<string>
+ {
+ return BindNamedParameter<T, string>(GenericType<T>.Class, str);
+ }
+
+ public ICsConfigurationBuilder BindIntNamedParam<T>(string str) where T : Name<int>
+ {
+ return BindNamedParameter<T, int>(GenericType<T>.Class, str);
+ }
+
+ public ICsConfigurationBuilder BindNamedParameter<U, V, T>()
+ where U : Name<T>
+ where V : T
+ {
+ return BindNamedParameter<U, V, T>(GenericType<U>.Class, GenericType<V>.Class);
+ }
+
+ public ICsConfigurationBuilder BindSetEntry<T1, T2, T3>()
+ where T1 : Name<ISet<T3>>
+ where T2 : T3
+ {
+ return BindSetEntry<T1, T2, T3>(GenericType<T1>.Class, GenericType<T2>.Class);
+ }
+
+ public ICsConfigurationBuilder BindSetEntry<U, T>(string value) where U : Name<ISet<T>>
+ {
+ return BindSetEntry<U, T>(GenericType<U>.Class, value);
+ }
+
+ public ICsConfigurationBuilder BindImplementation<T1, T2>() where T2 : T1
+ {
+ return BindImplementation(GenericType<T1>.Class, GenericType<T2>.Class);
+ }
+
+ public ICsConfigurationBuilder BindList<U, T>(IList<string> impl) where U : Name<IList<T>>
+ {
+ return BindList<U, T>(GenericType<U>.Class, impl);
+ }
+
+ public ICsConfigurationBuilder BindConstructor<T, U>() where U : IExternalConstructor<T>
+ {
+ return BindConstructor<T, U>(GenericType<T>.Class, GenericType<U>.Class);
+ }
+
+ #endregion extension methods
+
+ private INode GetNode(Type c)
+ {
+ return ((ICsClassHierarchy)ClassHierarchy).GetNode(c);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationImpl.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationImpl.cs b/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationImpl.cs
new file mode 100644
index 0000000..1964792
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/Configuration/CsConfigurationImpl.cs
@@ -0,0 +1,34 @@
+/**
+ * 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;
+using Org.Apache.Reef.Tang.Interface;
+
+namespace Org.Apache.Reef.Tang.Implementations
+{
+ public class CsConfigurationImpl : ConfigurationImpl
+ {
+ public CsConfigurationImpl(CsConfigurationBuilderImpl builder) : base(builder)
+ {
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Constructor.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Constructor.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Constructor.cs
new file mode 100644
index 0000000..77845e8
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Constructor.cs
@@ -0,0 +1,217 @@
+/**
+ * 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;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using Org.Apache.Reef.Utilities.Logging;
+using Org.Apache.Reef.Tang.Types;
+
+namespace Org.Apache.Reef.Tang.Implementations
+{
+ //Base case for an injection plan. A plan for a class.
+ public class Constructor : InjectionPlan
+ {
+ private static readonly Logger LOGGER = Logger.GetLogger(typeof(Constructor));
+
+ IConstructorDef constructor; //which constructor to use
+ InjectionPlan[] args; //constructor arguments in which we already got injectionPlan for each (nested cases)
+ int numAlternatives;
+ bool isAmbiguous;
+ bool isInjectable;
+
+ public InjectionPlan[] GetArgs()
+ {
+ return args;
+ }
+
+ public new ICollection<InjectionPlan> GetChildren()
+ {
+ return new ReadOnlyCollection<InjectionPlan>(this.args.OfType<InjectionPlan>().ToList());
+ }
+
+ public IConstructorDef GetConstructorDef()
+ {
+ return constructor;
+ }
+
+ public Constructor(IClassNode classNode,
+ IConstructorDef constructor, InjectionPlan[] args) : base(classNode)
+ {
+ this.constructor = constructor;
+ this.args = args;
+ int curAlternatives = 1;
+ bool curAmbiguous = false;
+ bool curInjectable = true;
+ foreach (InjectionPlan plan in args)
+ {
+ curAlternatives *= plan.GetNumAlternatives();
+ curAmbiguous |= plan.IsAmbiguous();
+ curInjectable &= plan.IsInjectable();
+ }
+ this.numAlternatives = curAlternatives;
+ this.isAmbiguous = curAmbiguous;
+ this.isInjectable = curInjectable;
+ }
+
+ public new IClassNode GetNode()
+ {
+ return (IClassNode) node;
+ }
+
+ public override int GetNumAlternatives()
+ {
+ return numAlternatives;
+ }
+
+ public override bool IsAmbiguous()
+ {
+ return isAmbiguous;
+ }
+
+ public override bool IsInjectable()
+ {
+ return isInjectable;
+ }
+
+ public override string ToString()
+ {
+ StringBuilder sb = new StringBuilder("new " + GetNode().GetName() + '(');
+ if (args.Length > 0)
+ {
+ sb.Append(args[0]);
+ for (int i = 1; i < args.Length; i++)
+ {
+ sb.Append(", " + args[i]);
+ }
+ }
+ sb.Append(')');
+ return sb.ToString();
+ }
+
+ private String ShallowArgString(InjectionPlan arg)
+ {
+ if (arg is Constructor || arg is Subplan)
+ {
+ return arg.GetType().Name + ": " + arg.GetNode().GetName();
+ }
+ else
+ {
+ return arg.ToShallowString();
+ }
+ }
+
+ public override string ToShallowString()
+ {
+ StringBuilder sb = new StringBuilder("new " + GetNode().GetName() + '(');
+ if (args.Length > 0)
+ {
+ sb.Append(ShallowArgString(args[0]));
+ for (int i = 1; i < args.Length; i++)
+ {
+ sb.Append(", " + ShallowArgString(args[i]));
+ }
+ }
+ sb.Append(')');
+ return sb.ToString();
+ }
+
+ public override string ToAmbiguousInjectString()
+ {
+
+ if (!isAmbiguous)
+ {
+ var ex = new ArgumentException(GetNode().GetFullName() + " is NOT ambiguous.");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ StringBuilder sb = new StringBuilder(GetNode().GetFullName() + " has ambiguous arguments: [ ");
+
+ foreach (InjectionPlan plan in args)
+ {
+ if (plan.IsAmbiguous())
+ {
+ sb.Append(plan.ToAmbiguousInjectString());
+ }
+ }
+
+ sb.Append(']');
+ return sb.ToString();
+ }
+
+ public override string ToInfeasibleInjectString()
+ {
+ IList<InjectionPlan> leaves = new List<InjectionPlan>();
+
+ foreach (InjectionPlan ip in args)
+ {
+ if (!ip.IsFeasible())
+ {
+ if (ip.IsInfeasibleLeaf())
+ {
+ leaves.Add(ip);
+ } else
+ {
+ return ip.ToInfeasibleInjectString();
+ }
+ }
+ }
+
+ if (leaves.Count == 0)
+ {
+ var ex = new ArgumentException(GetNode().GetFullName() + " has NO infeasible leaves.");
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ }
+
+ if (leaves.Count == 1)
+ {
+ return GetNode().GetFullName() + " missing argument " + leaves[0].GetNode().GetFullName();
+ }
+ else
+ {
+ StringBuilder sb = new StringBuilder(GetNode().GetFullName() + " missing arguments: [ ");
+ foreach (InjectionPlan leaf in leaves)
+ {
+ sb.Append(leaf.GetNode().GetFullName() + ' ');
+ }
+ sb.Append(']');
+ return sb.ToString();
+ }
+ }
+
+ public override bool IsInfeasibleLeaf()
+ {
+ return false;
+ }
+
+ //public override bool HasFutureDependency()
+ //{
+ // foreach (InjectionPlan p in args)
+ // {
+ // if(p.HasFutureDependency())
+ // {
+ // return true;
+ // }
+ // }
+ // return false;
+ //}
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/CsInstance.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/CsInstance.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/CsInstance.cs
new file mode 100644
index 0000000..eae1011
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/CsInstance.cs
@@ -0,0 +1,90 @@
+/**
+ * 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;
+using Org.Apache.Reef.Utilities.Logging;
+using Org.Apache.Reef.Tang.Types;
+
+namespace Org.Apache.Reef.Tang.Implementations
+{
+ public class CsInstance : InjectionPlan
+ {
+ public readonly object instance;
+ private static readonly Logger LOGGER = Logger.GetLogger(typeof(CsInstance));
+
+ public CsInstance(INode name, object instance) : base(name)
+ {
+ this.instance = instance;
+ }
+ public override int GetNumAlternatives()
+ {
+ return instance == null ? 0 : 1;
+ }
+
+ public override string ToString()
+ {
+ return GetNode() + " = " + instance;
+ }
+
+ public override bool IsAmbiguous()
+ {
+ return false;
+ }
+
+ public override bool IsInjectable()
+ {
+ return instance != null;
+ }
+
+ public string GetInstanceAsString()
+ {
+ return instance.ToString();
+ }
+
+ //public override bool HasFutureDependency()
+ //{
+ // return false;
+ //}
+
+ public override string ToAmbiguousInjectString()
+ {
+ var ex = new ArgumentException("toAmbiguousInjectString called on CsInstance!" + this.ToString());
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ return null;
+ }
+
+ public override string ToInfeasibleInjectString()
+ {
+ return GetNode() + " is not bound.";
+ }
+
+ public override bool IsInfeasibleLeaf()
+ {
+ return true;
+ }
+
+ public override string ToShallowString()
+ {
+ return ToString();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuture.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuture.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuture.cs
new file mode 100644
index 0000000..f849eae
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuture.cs
@@ -0,0 +1,100 @@
+/**
+ * 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 Org.Apache.Reef.Utilities.Logging;
+using Org.Apache.Reef.Tang.Annotations;
+using Org.Apache.Reef.Tang.Exceptions;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Util;
+
+namespace Org.Apache.Reef.Tang.Implementations
+{
+
+ public interface IInjectionFuture<out T>
+ {
+ T Get();
+ }
+
+ public class InjectionFutureImpl<T> : IInjectionFuture<T>
+ {
+ protected readonly InjectorImpl injector;
+ private readonly Type iface; //entend from T
+ private readonly T instance;
+
+ //public InjectionFuture()
+ //{
+ // injector = null;
+ // iface = null;
+ // instance = null;
+ //}
+
+ public InjectionFutureImpl(IInjector injector, Type iface)
+ {
+ this.injector = (InjectorImpl)injector;
+ this.iface = iface;
+ this.instance = default(T);
+ }
+
+ public InjectionFutureImpl(T instance)
+ {
+ this.injector = null;
+ this.iface = null;
+ this.instance = instance;
+ }
+
+ //public bool Cancel(bool mayInterruptIfRunning)
+ //{
+ // return false;
+ //}
+
+ //public bool IsCancelled()
+ //{
+ // return false;
+ //}
+
+ //public bool IsDone()
+ //{
+ // return true;
+ //}
+
+ public T Get()
+ {
+ if (instance != null) return instance;
+ lock(injector)
+ {
+ T t;
+ if (ReflectionUtilities.IsAssignableFromIgnoreGeneric(typeof(Name<>), iface))
+ {
+ t = (T)injector.GetNamedInstance(iface);
+ }
+ else
+ {
+ t = (T)injector.GetInstance(iface);
+ }
+ Aspect a = injector.GetAspect();
+ if(a != null)
+ {
+ a.InjectionFutureInstantiated(this, t);
+ }
+ return t;
+ }
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuturePlan.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuturePlan.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuturePlan.cs
new file mode 100644
index 0000000..e452701
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuturePlan.cs
@@ -0,0 +1,73 @@
+/**
+ * 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 Org.Apache.Reef.Utilities.Logging;
+using Org.Apache.Reef.Tang.Types;
+
+namespace Org.Apache.Reef.Tang.Implementations
+{
+ public class InjectionFuturePlan : InjectionPlan
+ {
+ private static readonly Logger LOGGER = Logger.GetLogger(typeof(InjectionFuturePlan));
+
+ public InjectionFuturePlan(INode name) : base (name)
+ {
+ }
+
+ public override int GetNumAlternatives()
+ {
+ return 1;
+ }
+
+ public override bool IsAmbiguous()
+ {
+ return false;
+ }
+
+ public override bool IsInjectable()
+ {
+ return true;
+ }
+
+ //public override bool HasFutureDependency()
+ //{
+ // return true;
+ //}
+
+ public override string ToAmbiguousInjectString()
+ {
+ throw new NotSupportedException("InjectionFuturePlan cannot be ambiguous!");
+ }
+
+ public override string ToInfeasibleInjectString()
+ {
+ throw new NotSupportedException("InjectionFuturePlan is always feasible!");
+ }
+
+ public override bool IsInfeasibleLeaf()
+ {
+ return false;
+ }
+
+ public override string ToShallowString()
+ {
+ return "InjectionFuture<"+GetNode().GetFullName()+">";
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionPlan.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionPlan.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionPlan.cs
new file mode 100644
index 0000000..6796b46
--- /dev/null
+++ b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionPlan.cs
@@ -0,0 +1,222 @@
+/**
+ * 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.Text;
+using Org.Apache.Reef.Utilities.Logging;
+using Org.Apache.Reef.Tang.Types;
+
+namespace Org.Apache.Reef.Tang.Implementations
+{
+ //contains the data for injecting a Node such as which Constructor to use, what are the arguments
+ public abstract class InjectionPlan : ITraversable<InjectionPlan>
+ {
+ protected INode node;
+
+ private static readonly Logger LOGGER = Logger.GetLogger(typeof(InjectionPlan));
+
+ public InjectionPlan(INode node)
+ {
+ this.node = node;
+ }
+
+ public INode GetNode()
+ {
+ return node;
+ }
+
+ /// <summary>
+ /// Get child elements of the injection plan tree. By default, returns an empty list.
+ /// </summary>
+ /// <returns>An empty list</returns>
+ public ICollection<InjectionPlan> GetChildren()
+ {
+ return new List<InjectionPlan>();
+ }
+
+ public abstract int GetNumAlternatives();
+
+ public bool IsFeasible()
+ {
+ return GetNumAlternatives() > 0;
+ }
+
+ abstract public bool IsAmbiguous();
+
+ abstract public bool IsInjectable();
+
+ //abstract public bool HasFutureDependency();
+
+ protected void pad(StringBuilder sb, int n)
+ {
+ for (int i = 0; i < n; i++)
+ {
+ sb.Append(" ");
+ }
+ }
+
+ private static void Newline(StringBuilder pretty, int indent)
+ {
+ pretty.Append('\n');
+ for (int j = 0; j < indent * 2; j++)
+ {
+ pretty.Append(' ');
+ }
+ }
+
+ public String ToPrettyString()
+ {
+ String ugly = node.GetFullName() + ":\n" + ToString();
+ StringBuilder pretty = new StringBuilder();
+ int currentIndent = 1;
+ for (int i = 0; i < ugly.Length; i++)
+ {
+ char c = ugly[i];
+ if (c == '(')
+ {
+ if (ugly[i + 1] == ')')
+ {
+ pretty.Append("()");
+ i++;
+ }
+ else
+ {
+ Newline(pretty, currentIndent);
+ currentIndent++;
+ pretty.Append(c);
+ pretty.Append(' ');
+ }
+ }
+ else if (c == '[')
+ {
+ if (ugly[i + 1] == ']')
+ {
+ pretty.Append("[]");
+ i++;
+ }
+ else
+ {
+ Newline(pretty, currentIndent);
+ currentIndent++;
+ pretty.Append(c);
+ pretty.Append(' ');
+ }
+ }
+ else if (c == ')' || c == ']')
+ {
+ currentIndent--;
+ Newline(pretty, currentIndent);
+ pretty.Append(c);
+ }
+ else if (c == '|')
+ {
+ Newline(pretty, currentIndent);
+ pretty.Append(c);
+ }
+ else if (c == ',')
+ {
+ currentIndent--;
+ Newline(pretty, currentIndent);
+ pretty.Append(c);
+ currentIndent++;
+ }
+ else
+ {
+ pretty.Append(c);
+ }
+ }
+ return pretty.ToString();
+ }
+
+ public string ToCantInjectString()
+ {
+ if (!IsFeasible())
+ {
+ return ToInfeasibleInjectString();
+ }
+ if (IsAmbiguous())
+ {
+ return ToAmbiguousInjectString();
+ }
+ var ex = new ArgumentException(
+ "toCantInjectString() called on injectable constructor:"
+ + this.ToPrettyString());
+ Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
+ return null;
+ }
+
+ public abstract string ToAmbiguousInjectString();
+
+ public abstract string ToInfeasibleInjectString();
+
+ public abstract bool IsInfeasibleLeaf();
+
+ public abstract string ToShallowString();
+
+ }
+
+ public class BuildingInjectionPlan : InjectionPlan
+ {
+
+ public BuildingInjectionPlan(INode node)
+ : base(node)
+ {
+ }
+
+ public override int GetNumAlternatives()
+ {
+ throw new NotSupportedException();
+ }
+
+ public override bool IsAmbiguous()
+ {
+ throw new NotSupportedException();
+ }
+
+ public override bool IsInjectable()
+ {
+ throw new NotSupportedException();
+ }
+
+ //public override bool HasFutureDependency()
+ //{
+ // throw new NotSupportedException();
+ //}
+
+ public override string ToAmbiguousInjectString()
+ {
+ throw new NotSupportedException();
+ }
+
+ public override string ToInfeasibleInjectString()
+ {
+ throw new NotSupportedException();
+ }
+
+ public override bool IsInfeasibleLeaf()
+ {
+ throw new NotSupportedException();
+ }
+
+ public override string ToShallowString()
+ {
+ throw new NotSupportedException();
+ }
+ }
+}