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:32 UTC
[11/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/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
deleted file mode 100644
index eae1011..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/CsInstance.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * 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/c1b5200f/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
deleted file mode 100644
index f849eae..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuture.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * 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/c1b5200f/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
deleted file mode 100644
index e452701..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionFuturePlan.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * 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/c1b5200f/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
deleted file mode 100644
index 6796b46..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectionPlan.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-/**
- * 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();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectorImpl.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectorImpl.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectorImpl.cs
deleted file mode 100644
index 6144f3e..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/InjectorImpl.cs
+++ /dev/null
@@ -1,1091 +0,0 @@
-/**
- * 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.Text;
-using System.Threading.Tasks;
-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 InjectorImpl : IInjector
- {
- private static readonly Logger LOGGER = Logger.GetLogger(typeof(InjectorImpl));
-
- IDictionary<INamedParameterNode, object> namedParameterInstances = new MonotonicTreeMap<INamedParameterNode, object>();
- private ICsClassHierarchy classHierarchy;
- private IConfiguration configuration;
- readonly IDictionary<IClassNode, Object> instances = new MonotonicTreeMap<IClassNode, Object>();
- private Aspect aspect;
- private readonly ISet<IInjectionFuture<object>> pendingFutures = new HashSet<IInjectionFuture<object>>();
-
- static readonly InjectionPlan BUILDING = new BuildingInjectionPlan(null); //TODO anonymous class
-
-
- private bool concurrentModificationGuard = false;
-
- private void AssertNotConcurrent()
- {
- if (concurrentModificationGuard)
- {
- //TODO
- //throw new ConcurrentModificationException("Detected attempt to use Injector from within an injected constructor!");
- }
- }
- public InjectorImpl(IConfiguration c)
- {
- this.configuration = c;
- this.classHierarchy = (ICsClassHierarchy)c.GetClassHierarchy();
- }
-
- public object InjectFromPlan(InjectionPlan plan)
- {
- if (!plan.IsFeasible())
- {
- var ex = new InjectionException("Cannot inject " + plan.GetNode().GetFullName() + ": "
- + plan.ToCantInjectString());
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
-
- if (plan.IsAmbiguous())
- {
- var ex = new InjectionException("Cannot inject " + plan.GetNode().GetFullName() + " "
- + plan.ToCantInjectString());
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
-
- if (plan is InjectionFuturePlan)
- {
- InjectionFuturePlan fut = (InjectionFuturePlan)plan;
- INode node = fut.GetNode();
- string key = node.GetFullName();
- try
- {
- Type t = null;
- Type nodeType = classHierarchy.ClassForName(node.GetFullName());
-
- if (node is IClassNode)
- {
- t = nodeType;
- }
- else if (node is INamedParameterNode)
- {
- var nn = (INamedParameterNode)node;
- t = classHierarchy.ClassForName(nn.GetFullArgName());
- if (nn.IsSet())
- {
- t = typeof (ISet<>).MakeGenericType(new Type[] {t});
- }
- }
- else
- {
- var ex = new ApplicationException("Unexpected node type. Wanted ClassNode or NamedParameterNode. Got: " + node);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
-
- //Java - InjectionFuture<?> ret = new InjectionFuture<>(this, javaNamespace.classForName(fut.getNode().getFullName()));
- //C# - InjectionFuture<object> ret = new InjectionFutureImpl<object>(this, classHierarchy.ClassForName(fut.GetNode().GetFullName()));
- //We cannot simply create an object from generic with object as <T>
- //typeof(InjectionFutureImpl<>).MakeGenericType(t) will get the InjectionFutureImpl generic Type with <T> as t
- //for ClassNode, t is the Type of the class, for NamedParamterNode, t is the Type of the argument
- //we then use reflection to invoke the constructor
- //To retain generic argument information??
- Type injectionFuture = typeof (InjectionFutureImpl<>).MakeGenericType(t);
- var constructor = injectionFuture.GetConstructor(new Type[] { typeof(IInjector), typeof(Type) });
- IInjectionFuture<object> ret = (IInjectionFuture<object>)constructor.Invoke(new object[] { this, nodeType });
-
- pendingFutures.Add(ret);
- return ret;
- }
- catch (TypeLoadException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new InjectionException("Could not get class for " + key), LOGGER);
- }
- }
- else if (plan.GetNode() is IClassNode && null != GetCachedInstance((IClassNode)plan.GetNode()))
- {
- return GetCachedInstance((IClassNode)plan.GetNode());
- }
- else if (plan is CsInstance)
- {
- // TODO: Must be named parameter node. Check.
- // throw new IllegalStateException("Instance from plan not in Injector's set of instances?!?");
- return ((CsInstance)plan).instance;
- }
- else if (plan is Constructor)
- {
- Constructor constructor = (Constructor)plan;
- object[] args = new object[constructor.GetArgs().Length];
- InjectionPlan[] argPlans = constructor.GetArgs();
-
- for (int i = 0; i < argPlans.Length; i++)
- {
- args[i] = InjectFromPlan(argPlans[i]);
- }
-
- try
- {
- concurrentModificationGuard = true;
- object ret = null;
- try
- {
- IConstructorDef def = (IConstructorDef)constructor.GetConstructorDef();
- ConstructorInfo c = GetConstructor(def);
-
- if (aspect != null)
- {
- ret = aspect.Inject(def, c, args);
- }
- else
- {
- ret = c.Invoke(args);
- }
- }
- catch (ArgumentException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- StringBuilder sb = new StringBuilder("Internal Tang error? Could not call constructor " + constructor.GetConstructorDef() + " with arguments [");
- foreach (Object o in args)
- {
- sb.Append("\n\t" + o);
- }
- sb.Append("]");
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException(sb.ToString(), e), LOGGER);
- }
- if (ret is IExternalConstructor<object>)
- {
- ret = ((IExternalConstructor<object>)ret).NewInstance();
- }
- instances.Add(constructor.GetNode(), ret);
- return ret;
- }
- catch (TargetInvocationException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new InjectionException("Could not invoke constructor: " + plan, e), LOGGER);
- }
- finally
- {
- concurrentModificationGuard = false;
- }
- }
- else if (plan is Subplan)
- {
- Subplan ambiguous = (Subplan)plan;
- return InjectFromPlan(ambiguous.GetDelegatedPlan());
- }
- else if (plan is SetInjectionPlan)
- {
- SetInjectionPlan setPlan = (SetInjectionPlan)plan;
- INode n = setPlan.GetNode();
- string typeOfSet = null;
-
- // TODO: This doesn't work for sets of generics (e.g., Set<Foo<int>>
- // because GetFullName and GetFullArgName strip generic info).
- if (n is INamedParameterNode)
- {
- INamedParameterNode np = (INamedParameterNode)n;
- typeOfSet = np.GetFullArgName();
- }
- else if (n is IClassNode)
- {
- typeOfSet = n.GetFullName();
- }
- else
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Unknown node type :" + n.ToString()), LOGGER);
- }
-
- Type t = classHierarchy.ClassForName(typeOfSet);
- // MakeGenericType(t = int: MonotonicHashSet<> -> MonotonicHashSet<int>
- // Get constructor: MonotonicHashSet<int> -> public MonotonicHashSet<int>() { ... }
- // Invoke: public MonotonicHashSet<int> -> new MonotonicHashSet<int>()
-
- object ret = typeof(MonotonicHashSet<>).MakeGenericType(t).GetConstructor(new Type[] { }).Invoke(new object[] { }); //(this, classHierarchy.ClassForName(fut.GetNode().GetFullName()));
-
- MethodInfo mf = ret.GetType().GetMethod("Add");
-
- foreach (InjectionPlan subplan in setPlan.GetEntryPlans())
- {
-// ret.Add(InjectFromPlan(subplan));
- mf.Invoke(ret, new object[] {InjectFromPlan(subplan)});
- }
- return ret;
- }
- else if (plan is ListInjectionPlan)
- {
- ListInjectionPlan listPlan = (ListInjectionPlan)plan;
- INode n = listPlan.GetNode();
- string typeOfList = null;
-
- if (n is INamedParameterNode)
- {
- INamedParameterNode np = (INamedParameterNode)n;
- typeOfList = np.GetFullArgName();
- }
- else if (n is IClassNode)
- {
- typeOfList = n.GetFullName();
- }
- else
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Unknown node type :" + n.ToString()), LOGGER);
- }
-
- Type t = classHierarchy.ClassForName(typeOfList);
- object ret = typeof(List<>).MakeGenericType(t).GetConstructor(new Type[] { }).Invoke(new object[] { });
-
- MethodInfo mf = ret.GetType().GetMethod("Add");
-
- foreach (InjectionPlan subplan in listPlan.GetEntryPlans())
- {
- mf.Invoke(ret, new object[] { InjectFromPlan(subplan) });
- }
- return ret;
- }
- else
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException("Unknown plan type: " + plan), LOGGER);
- }
- return null; // should never reach here
- }
-
- private object GetCachedInstance(IClassNode cn)
- {
- if (cn.GetFullName().Equals(ReflectionUtilities.GetAssemblyQualifiedName(typeof(IInjector))))
- //if (cn.GetFullName().Equals(ReflectionUtilities.NonGenericFullName(typeof(IInjector))))
- {
- return this.ForkInjector();// TODO: We should be insisting on injection futures here! .forkInjector();
- }
- else
- {
- object t = null;
-
- instances.TryGetValue(cn, out t);
-
- if (t != null && t is IInjectionFuture<object>)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException("Found an injection future in getCachedInstance: " + cn), LOGGER);
- }
- return t;
- }
- }
-
- private ConstructorInfo GetConstructor(IConstructorDef constructor)
- {
- Type clazz = (Type)this.classHierarchy.ClassForName(constructor.GetClassName());
- IConstructorArg[] args = constructor.GetArgs().ToArray();
- Type[] parameterTypes = new Type[args.Length];
- for (int i = 0; i < args.Length; i++)
- {
- if (args[i].IsInjectionFuture())
- {
- parameterTypes[i] = typeof(IInjectionFuture<>).MakeGenericType(new Type[] { this.classHierarchy.ClassForName(args[i].Gettype()) });
- }
- else
- {
- parameterTypes[i] = this.classHierarchy.ClassForName(args[i].Gettype());
- }
- }
-
- ConstructorInfo cons = clazz.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, parameterTypes, null);
- //TODO
- //cons.setAccessible(true);
-
- if (cons == null)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Failed to look up constructor: " + constructor.ToString()), LOGGER);
- }
- return cons;
- }
-
- private void BuildInjectionPlan(INode n, IDictionary<INode, InjectionPlan> memo)
- {
- if (memo.ContainsKey(n))
- {
- InjectionPlan p = null;
- memo.TryGetValue(n, out p);
- if (BUILDING == p)
- {
- StringBuilder loopyList = new StringBuilder("[");
- foreach (INode node in memo.Keys)
- {
- InjectionPlan p1 = null;
- memo.TryGetValue(node, out p1);
- if (p1 == BUILDING)
- {
- loopyList.Append(" " + node.GetFullName());
- }
- }
- loopyList.Append(" ]");
- var ex = new ClassHierarchyException("Detected loopy constructor involving "
- + loopyList.ToString());
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- else
- {
- return;
- }
- }
- memo.Add(n, BUILDING);
- InjectionPlan ip = null;
- if (n is INamedParameterNode)
- {
- INamedParameterNode np = (INamedParameterNode)n;
- object boundInstance = ParseBoundNamedParameter(np);
- object defaultInstance = this.classHierarchy.ParseDefaultValue(np);
- object instance = boundInstance != null ? boundInstance : defaultInstance;
-
- if (instance is INode)
- {
- BuildInjectionPlan((INode)instance, memo);
- InjectionPlan sp;
- memo.TryGetValue((INode)instance, out sp);
- ip = new Subplan(n, 0, new InjectionPlan[] { sp });
- }
- else if (instance is ISet<object>)
- {
- ISet<object> entries = (ISet<object>)instance;
- ip = CreateSetInjectionPlan(n, memo, entries);
- }
- else if (instance is ISet<INode>)
- {
- ISet<INode> entries = (ISet<INode>)instance;
- ip = CreateSetInjectionPlan(n, memo, entries);
- }
- else if (instance is IList<object>)
- {
- IList<object> entries = (IList<object>)instance;
- ip = CreateListInjectionPlan(n, memo, entries);
- }
- else if (instance is IList<INode>)
- {
- IList<INode> entries = (IList<INode>)instance;
- ip = CreateListInjectionPlan(n, memo, entries);
- }
- else
- {
- ip = new CsInstance(np, instance);
- }
-
- }
- else if (n is IClassNode)
- {
- IClassNode cn = (IClassNode)n;
-
- // Any (or all) of the next four values might be null; that's fine.
- object cached = GetCachedInstance(cn);
- IClassNode boundImpl = this.configuration.GetBoundImplementation(cn);
- IClassNode defaultImpl = ParseDefaultImplementation(cn);
- IClassNode ec = this.configuration.GetBoundConstructor(cn);
-
- ip = BuildClassNodeInjectionPlan(cn, cached, ec, boundImpl, defaultImpl, memo);
- }
- else if (n is IPackageNode)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ArgumentException(
- "Request to instantiate Java package as object"), LOGGER);
- }
- else
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException(
- "Type hierarchy contained unknown node type!:" + n), LOGGER);
- }
- memo[n] = ip;
- }
-
- private InjectionPlan CreateSetInjectionPlan<T>(INode n, IDictionary<INode, InjectionPlan> memo, ISet<T> entries)
- {
- ISet<InjectionPlan> plans = new MonotonicHashSet<InjectionPlan>();
- CreateInjectionPlanForCollectionElements(n, memo, entries, plans);
- return new SetInjectionPlan(n, plans);
- }
-
- private void CreateInjectionPlanForCollectionElements<T>(INode n, IDictionary<INode, InjectionPlan> memo, ICollection<T> entries, ICollection<InjectionPlan> plans)
- {
- foreach (var entry in entries)
- {
- if (entry is IClassNode)
- {
- BuildInjectionPlan((IClassNode) entry, memo);
- InjectionPlan p2 = null;
- memo.TryGetValue((INode) entry, out p2);
- if (p2 != null)
- {
- plans.Add(p2);
- }
- }
- else
- {
- plans.Add(new CsInstance(n, entry));
- }
- }
- }
-
- private InjectionPlan CreateListInjectionPlan<T>(INode n, IDictionary<INode, InjectionPlan> memo, IList<T> entries)
- {
- IList<InjectionPlan> plans = new List<InjectionPlan>();
- CreateInjectionPlanForCollectionElements(n, memo, entries, plans);
- return new ListInjectionPlan(n, plans);
- }
-
- private InjectionPlan BuildClassNodeInjectionPlan(IClassNode cn,
- object cachedInstance,
- IClassNode externalConstructor,
- IClassNode boundImpl,
- IClassNode defaultImpl,
- IDictionary<INode, InjectionPlan> memo)
- {
- if (cachedInstance != null)
- {
- return new CsInstance(cn, cachedInstance);
- }
- else if (externalConstructor != null)
- {
- BuildInjectionPlan(externalConstructor, memo);
- InjectionPlan ip = null;
- memo.TryGetValue(externalConstructor, out ip);
- return new Subplan(cn, 0, new InjectionPlan[] { ip });
- }
- else if (boundImpl != null && !cn.Equals(boundImpl))
- {
- // We need to delegate to boundImpl, so recurse.
- BuildInjectionPlan(boundImpl, memo);
- InjectionPlan ip = null;
- memo.TryGetValue(boundImpl, out ip);
- return new Subplan(cn, 0, new InjectionPlan[] { ip });
- }
- else if (defaultImpl != null && !cn.Equals(defaultImpl))
- {
- BuildInjectionPlan(defaultImpl, memo);
- InjectionPlan ip = null;
- memo.TryGetValue(defaultImpl, out ip);
- return new Subplan(cn, 0, new InjectionPlan[] { ip });
- }
- else
- {
- // if we're here and there is a bound impl or a default impl,
- // then we're bound / defaulted to ourselves, so don't add
- // other impls to the list of things to consider.
- List<IClassNode> candidateImplementations = new List<IClassNode>();
- candidateImplementations.Add(cn);
- List<InjectionPlan> sub_ips = FilterCandidateConstructors(candidateImplementations, memo);
- if (sub_ips.Count == 1)
- {
- return WrapInjectionPlans(cn, sub_ips, false, -1);
- }
- return WrapInjectionPlans(cn, sub_ips, true, -1);
- }
- }
-
- private List<InjectionPlan> FilterCandidateConstructors(
- List<IClassNode> candidateImplementations,
- IDictionary<INode, InjectionPlan> memo)
- {
- List<InjectionPlan> sub_ips = new List<InjectionPlan>();
-
- #region each implementation
- foreach (IClassNode thisCN in candidateImplementations)
- {
- List<InjectionPlan> constructors = new List<InjectionPlan>();
- List<IConstructorDef> constructorList = new List<IConstructorDef>();
- if (null != this.configuration.GetLegacyConstructor(thisCN))
- {
- constructorList.Add(this.configuration.GetLegacyConstructor(thisCN));
- }
-
- foreach (var c in thisCN.GetInjectableConstructors())
- {
- constructorList.Add(c);
- }
-
- #region each constructor
- foreach (IConstructorDef def in constructorList)
- {
- List<InjectionPlan> args = new List<InjectionPlan>();
- IConstructorArg[] defArgs = def.GetArgs().ToArray<IConstructorArg>();
-
- #region each argument
- foreach (IConstructorArg arg in defArgs)
- {
- if (!arg.IsInjectionFuture())
- {
- try
- {
- INode argNode = this.classHierarchy.GetNode(arg.GetName());
- BuildInjectionPlan(argNode, memo);
- InjectionPlan ip = null;
- memo.TryGetValue(argNode, out ip);
- args.Add(ip);
- }
- catch (NameResolutionException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
-
- var ex = new IllegalStateException("Detected unresolvable "
- + "constructor arg while building injection plan. "
- + "This should have been caught earlier!", e);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- }
- else
- {
- try
- {
- args.Add(new InjectionFuturePlan(this.classHierarchy.GetNode(arg.GetName())));
- }
- catch (NameResolutionException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- var ex = new IllegalStateException("Detected unresolvable "
- + "constructor arg while building injection plan. "
- + "This should have been caught earlier!", e);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- }
- }
- #endregion each argument
-
- Constructor constructor = new Constructor(thisCN, def, args.ToArray());
- constructors.Add(constructor);
- }
- #endregion each constructor
-
- // The constructors are embedded in a lattice defined by
- // isMoreSpecificThan(). We want to see if, amongst the injectable
- // plans, there is a unique dominant plan, and select it.
- // First, compute the set of injectable plans.
- List<Int32> liveIndices = new List<Int32>();
- for (int i = 0; i < constructors.Count; i++)
- {
- if (constructors[i].GetNumAlternatives() > 0)
- {
- liveIndices.Add(i);
- }
- }
- // Now, do an all-by-all comparison, removing indices that are dominated
- // by others.
- int k = -1;
- for (int i = 0; i < liveIndices.Count; i++)
- {
- for (int j = i + 1; j < liveIndices.Count; j++)
- {
- IConstructorDef ci = ((Constructor)constructors[(liveIndices[i])]).GetConstructorDef();
- IConstructorDef cj = ((Constructor)constructors[(liveIndices[j])]).GetConstructorDef();
-
- if (ci.IsMoreSpecificThan(cj)) //ci's arguments is a superset of cj's
- {
- k = i;
- }
- else if (cj.IsMoreSpecificThan(ci))
- {
- k = j;
- }
- }
- }
- if (liveIndices.Count == 1)
- {
- k = 0;
- }
- if (constructors.Count > 0)
- {
- sub_ips.Add(WrapInjectionPlans(thisCN, constructors, false, k != -1 ? liveIndices[k] : -1));
- }
- }
- #endregion each implementation
- return sub_ips;
- }
-
-
- private InjectionPlan WrapInjectionPlans(IClassNode infeasibleNode,
- List<InjectionPlan> list, bool forceAmbiguous, int selectedIndex)
- {
- if (list.Count == 0)
- {
- return new Subplan(infeasibleNode, new InjectionPlan[] { });
- }
- else if ((!forceAmbiguous) && list.Count == 1)
- {
- return list[0];
- }
- else
- {
- return new Subplan(infeasibleNode, selectedIndex, list.ToArray());
- }
- }
-
- private IClassNode ParseDefaultImplementation(IClassNode cn)
- {
- if (cn.GetDefaultImplementation() != null)
- {
- try
- {
- return (IClassNode)this.classHierarchy.GetNode(cn.GetDefaultImplementation());
- }
- catch (NameResolutionException e)
- {
- var ex = new IllegalStateException("After validation, " + cn + " had a bad default implementation named " + cn.GetDefaultImplementation(), e);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.CaughtAndThrow(ex, Level.Error, LOGGER);
- }
- }
- return null;
- }
-
- private object ParseBoundNamedParameter(INamedParameterNode np)
- {
- ISet<object> boundSet = this.configuration.GetBoundSet((INamedParameterNode)np);
- if (boundSet.Count != 0)
- {
- ISet<INode> ret3 = new MonotonicSet<INode>();
- ISet<object> ret2 = new MonotonicSet<object>();
- return ParseElementsInCollection(np, boundSet, ret3, ret2);
- }
-
- IList<object> boundList = this.configuration.GetBoundList((INamedParameterNode)np);
- if (boundList != null && boundList.Count != 0)
- {
- IList<INode> ret3 = new List<INode>();
- IList<object> ret2 = new List<object>();
- return ParseElementsInCollection(np, boundList, ret3, ret2);
- }
-
- object ret = null;
- if (namedParameterInstances.ContainsKey(np))
- {
- namedParameterInstances.TryGetValue(np, out ret);
- }
- else
- {
- string value = this.configuration.GetNamedParameter(np);
- if (value == null)
- {
- ret = null;
- }
- else
- {
- try
- {
- ret = this.classHierarchy.Parse(np, value);
- namedParameterInstances.Add(np, ret);
- }
- catch (BindException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.CaughtAndThrow(new IllegalStateException(
- "Could not parse pre-validated value", e), Level.Error, LOGGER);
- }
- }
- }
- return ret;
- }
-
- private object ParseElementsInCollection(INamedParameterNode np, ICollection<object> boundSet, ICollection<INode> ret3, ICollection<object> ret2)
- {
- foreach (object o in boundSet)
- {
- if (o is string)
- {
- try
- {
- var r = this.classHierarchy.Parse(np, (string) o);
- if (r is INode)
- {
- ret3.Add((INode) r);
- }
- else
- {
- ret2.Add(r);
- }
- }
- catch (ParseException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- var ex =
- new IllegalStateException("Could not parse " + o + " which was passed into " + np +
- " FIXME: Parsability is not currently checked by bindSetEntry(Node,String)");
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- }
- else if (o is INode)
- {
- var o2 = o as INode;
- ret3.Add(o2);
- }
- else
- {
- var ex =
- new IllegalStateException("Unexpected object " + o +
- " in bound set. Should consist of nodes and strings");
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- }
- if (ret2.Count > 0 && ret3.Count == 0)
- {
- return ret2;
- }
- if (ret3.Count > 0 && ret2.Count == 0)
- {
- return ret3;
- }
- if (ret2.Count > 0 && ret3.Count > 0)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ApplicationException("Set contains different types of object"), LOGGER);
- }
- return ret2;
- }
-
- public object GetInstance(Type iface)
- {
- return GetInstance(ReflectionUtilities.GetAssemblyQualifiedName(iface));
- }
-
- public T GetInstance<T>() where T : class
- {
- return (T)GetInstance(ReflectionUtilities.GetAssemblyQualifiedName(typeof(T)));
- }
-
- private void CheckNamedParameter(Type t)
- {
- if (ReflectionUtilities.IsAssignableFromIgnoreGeneric(typeof (Name<>), t))
- {
- var ex = new InjectionException("GetInstance() called on Name "
- + ReflectionUtilities.GetName(t)
- + " Did you mean to call GetNamedInstance() instead?");
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- }
-
- private object GetInstance(INode node)
- {
- InjectionPlan plan = (InjectionPlan)GetInjectionPlan(node);
- object u = InjectFromPlan(plan);
-
- while (pendingFutures.Count != 0)
- {
- IEnumerator<object> i = pendingFutures.GetEnumerator();
- i.MoveNext();
- IInjectionFuture<object> f = (IInjectionFuture<object>)i.Current;
- pendingFutures.Remove(f);
- f.Get();
- }
- return u;
- }
-
- public object GetInstance(string clazz)
- {
- CheckNamedParameter(ReflectionUtilities.GetTypeByName(clazz));
- return GetInstance(classHierarchy.GetNode(clazz));
- }
-
- public U GetNamedInstance<T, U>(GenericType<T> clazz) where T : Name<U>
- {
- Type t = typeof(T);
- return (U)GetInstance(classHierarchy.GetNode(t));
- }
-
- public U GetNamedInstance<T, U>() where T : Name<U>
- {
- Type t = typeof(T);
- return (U)GetInstance(classHierarchy.GetNode(t));
- }
-
- public object GetNamedInstance(Type t)
- {
- if (!ReflectionUtilities.IsAssignableFromIgnoreGeneric(typeof (Name<>), t))
- {
- var ex = new ApplicationException(string.Format(CultureInfo.CurrentCulture, "The parameter {0} is not inherit from Name<>", t));
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- return GetInstance(classHierarchy.GetNode(t));
- }
-
- public InjectionPlan GetInjectionPlan(Type name)
- {
- return GetInjectionPlan(this.classHierarchy.GetNode(name));
- }
-
- public InjectionPlan GetInjectionPlan(INode n)
- {
- AssertNotConcurrent();
- IDictionary<INode, InjectionPlan> memo = new Dictionary<INode, InjectionPlan>();
- BuildInjectionPlan(n, memo);
-
- InjectionPlan p = null;
- memo.TryGetValue(n, out p);
-
- if (p != null)
- {
- return p;
- }
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new InjectionException("Fail to get injection plan" + n), LOGGER);
- return null;//this line shouild be not reached as Throw throws exception
- }
-
- public bool IsInjectable(string name)
- {
- return GetInjectionPlan(this.classHierarchy.GetNode(name)).IsInjectable();
- }
-
- public bool IsParameterSet(string name)
- {
- InjectionPlan p = GetInjectionPlan(classHierarchy.GetNode(name));
- return p.IsInjectable();
- }
-
- public bool IsInjectable(Type clazz)
- {
- AssertNotConcurrent();
- try
- {
- return IsInjectable(ReflectionUtilities.GetAssemblyQualifiedName(clazz));
- }
- catch (NameResolutionException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException("Could not round trip " + clazz + " through ClassHierarchy", e), LOGGER);
- return false;
- }
- }
-
- public bool IsParameterSet(Type name)
- {
- return IsParameterSet(ReflectionUtilities.GetAssemblyQualifiedName(name));
- }
-
- public void BindAspect(Aspect a)
- {
- if (aspect != null)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new BindException("Attempt to re-bind aspect! old=" + aspect + " new=" + a), LOGGER);
- }
- aspect = a;
- }
-
- public Aspect GetAspect()
- {
- return aspect;
- }
-
- public IInjector ForkInjector()
- {
- try
- {
- return ForkInjector(new ConfigurationImpl[0]);
- }
- catch (BindException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException("Error in forking injector.", e), LOGGER);
- return null;
- }
- }
-
- public IInjector ForkInjector(IConfiguration[] configurations)
- {
- InjectorImpl ret;
- ret = Copy(this, configurations);
- return ret;
- }
-
- private static InjectorImpl Copy(InjectorImpl old, IConfiguration[] configurations)
- {
- InjectorImpl injector = null;
- try
- {
- IConfigurationBuilder cb = old.configuration.newBuilder();
- foreach (IConfiguration c in configurations)
- {
- cb.AddConfiguration(c);
- }
- injector = new InjectorImpl(cb.Build());
- }
- catch (BindException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException("Unexpected error copying configuration!", e), LOGGER);
- }
-
- foreach (IClassNode cn in old.instances.Keys)
- {
- if (cn.GetFullName().Equals(ReflectionUtilities.GetAssemblyQualifiedName(typeof(IInjector)))
- || cn.GetFullName().Equals(ReflectionUtilities.GetAssemblyQualifiedName(typeof(InjectorImpl))))
- {
- // This would imply that we're treating injector as a singleton somewhere. It should be copied fresh each time.
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException(""), LOGGER);
- }
- try
- {
- IClassNode new_cn = (IClassNode)injector.classHierarchy.GetNode(cn.GetFullName());
-
- object o = null;
- old.instances.TryGetValue(cn, out o);
- if (o != null)
- {
- injector.instances.Add(new_cn, o);
- }
- }
- catch (BindException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException("Could not resolve name "
- + cn.GetFullName() + " when copying injector", e), LOGGER);
- }
- }
-
- foreach (INamedParameterNode np in old.namedParameterInstances.Keys)
- {
- // if (!builder.namedParameters.containsKey(np)) {
- Object o = null;
- old.namedParameterInstances.TryGetValue(np, out o);
- INamedParameterNode new_np = (INamedParameterNode)injector.classHierarchy.GetNode(np.GetFullName());
- injector.namedParameterInstances.Add(new_np, o);
- }
-
- // Fork the aspect (if any)
- if (old.aspect != null)
- {
- injector.BindAspect(old.aspect.CreateChildAspect());
- }
- return injector;
- }
-
- void BindVolatileInstanceNoCopy<T>(GenericType<T> c, T o)
- {
- AssertNotConcurrent();
- INode n = this.classHierarchy.GetNode(typeof(T));
- if (n is IClassNode)
- {
- IClassNode cn = (IClassNode) n;
- object old = GetCachedInstance(cn);
- if (old != null) {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new BindException("Attempt to re-bind instance. Old value was "
- + old + " new value is " + o), LOGGER);
- }
- instances.Add(cn, o);
- } else {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new ArgumentException("Expected Class but got " + c
- + " (probably a named parameter)."), LOGGER);
- }
- }
-
- //void BindVolatileParameterNoCopy(Class<? extends Name<T>> c, T o)
- void BindVolatileParameterNoCopy<U, T>(GenericType<U> c, T o)
- where U : Name<T>
- {
- INode n = this.classHierarchy.GetNode(typeof(U));
- if (n is INamedParameterNode)
- {
- INamedParameterNode np = (INamedParameterNode) n;
- Object old = this.configuration.GetNamedParameter(np);
- if(old != null)
- {
- // XXX need to get the binding site here!
- var ex = new BindException(
- "Attempt to re-bind named parameter " + ReflectionUtilities.GetAssemblyQualifiedName(typeof(U)) + ". Old value was [" + old
- + "] new value is [" + o + "]");
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- try
- {
- namedParameterInstances.Add(np, o);
- }
- catch (ArgumentException e)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Caught(e, Level.Error, LOGGER);
- var ex = new BindException(
- "Attempt to re-bind named parameter " + ReflectionUtilities.GetAssemblyQualifiedName(typeof(U)) + ". Old value was [" + old
- + "] new value is [" + o + "]");
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- }
- else
- {
- var ex = new ArgumentException("Expected Name, got " + typeof(U) + " (probably a class)");
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(ex, LOGGER);
- }
- }
-
- //public <T> void bindVolatileInstance(Class<T> c, T o) throws BindException {
- public void BindVolatileInstance<T>(GenericType<T> iface, T inst)
- {
- BindVolatileInstanceNoCopy(iface, inst);
- }
-
- /// <summary>
- /// Binds the volatile instance.
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="inst">The inst.</param>
- public void BindVolatileInstance<T>(T inst)
- {
- BindVolatileInstance<T>(GenericType<T>.Class, inst);
- }
-
- /// <summary>
- /// Binds the volatile parameter.
- /// </summary>
- /// <typeparam name="U"></typeparam>
- /// <typeparam name="T"></typeparam>
- /// <param name="iface">The iface.</param>
- /// <param name="inst">The inst.</param>
- public void BindVolatileParameter<U, T>(GenericType<U> iface, T inst) where U : Name<T>
- {
- BindVolatileParameterNoCopy(iface, inst);
- }
-
- /// <summary>
- /// Binds the volatile parameter.
- /// </summary>
- /// <typeparam name="U"></typeparam>
- /// <typeparam name="T"></typeparam>
- /// <param name="inst">The inst.</param>
- public void BindVolatileParameter<U, T>(T inst) where U : Name<T>
- {
- BindVolatileParameter(GenericType<U>.Class, inst);
- }
-
- //public T GetNamedParameter<U, T>(GenericType<U> name) where U : Name<T>
- //{
- // return (T)GetNamedInstance(typeof(U));
- //}
-
- //public IInjector CreateChildInjector(IConfiguration[] configurations)
- //{
- // return ForkInjector(configurations);
- //}
- /// <summary>
- /// Gets the injection plan for a given class name
- /// </summary>
- /// <param name="name">The name.</param>
- /// <returns></returns>
- public InjectionPlan GetInjectionPlan(string name)
- {
- return GetInjectionPlan(this.classHierarchy.GetNode(name));
-
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/ListInjectionPlan.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/ListInjectionPlan.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/ListInjectionPlan.cs
deleted file mode 100644
index 8a5ad49..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/ListInjectionPlan.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * 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;
-using System.Text;
-using Org.Apache.Reef.Tang.Types;
-
-namespace Org.Apache.Reef.Tang.Implementations
-{
- public class ListInjectionPlan : InjectionPlan
- {
- private readonly IList<InjectionPlan> entries = new List<InjectionPlan>();
- private readonly int numAlternatives;
- private readonly bool isAmbiguous;
- private readonly bool isInjectable;
-
- public ListInjectionPlan(INode name, IList<InjectionPlan> entries) : base(name)
- {
- foreach (InjectionPlan ip in entries)
- {
- this.entries.Add(ip);
- }
- int numAlternatives = 1;
- bool isAmbiguous = false;
- bool isInjectable = true;
- foreach (InjectionPlan ip in entries)
- {
- numAlternatives *= ip.GetNumAlternatives();
- isAmbiguous |= ip.IsAmbiguous();
- isInjectable &= ip.IsInjectable();
- }
- this.numAlternatives = numAlternatives;
- this.isAmbiguous = isAmbiguous;
- this.isInjectable = isInjectable;
- }
-
- public override int GetNumAlternatives()
- {
- return numAlternatives;
- }
-
- public override bool IsAmbiguous()
- {
- return isAmbiguous;
- }
-
- public override bool IsInjectable()
- {
- return isInjectable;
- }
-
- public IList<InjectionPlan> GetEntryPlans()
- {
- return new List<InjectionPlan>(this.entries);
- }
-
- public override string ToAmbiguousInjectString()
- {
- StringBuilder sb = new StringBuilder(GetNode().GetFullName() + "(list) includes ambiguous plans [");
- foreach (InjectionPlan ip in entries)
- {
- if (ip.IsAmbiguous())
- {
- sb.Append("\n" + ip.ToAmbiguousInjectString());
- }
- }
- sb.Append("]");
- return sb.ToString();
- }
-
- public override string ToInfeasibleInjectString()
- {
- StringBuilder sb = new StringBuilder(GetNode().GetFullName() + "(list) includes infeasible plans [");
- foreach (InjectionPlan ip in entries)
- {
- if (!ip.IsFeasible())
- {
- sb.Append("\n" + ip.ToInfeasibleInjectString());
- }
- }
- sb.Append("\n]");
- return sb.ToString();
- }
-
- public override bool IsInfeasibleLeaf()
- {
- return false;
- }
-
- public override string ToShallowString()
- {
- StringBuilder sb = new StringBuilder("list { ");
- foreach (InjectionPlan ip in entries)
- {
- sb.Append("\n" + ip.ToShallowString());
- }
- sb.Append("\n } ");
- return null;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/SetInjectionPlan.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/SetInjectionPlan.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/SetInjectionPlan.cs
deleted file mode 100644
index 1b530b6..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/SetInjectionPlan.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
- * 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;
-using System.Text;
-using Org.Apache.Reef.Tang.Types;
-using Org.Apache.Reef.Tang.Util;
-
-namespace Org.Apache.Reef.Tang.Implementations
-{
- public class SetInjectionPlan : InjectionPlan
- {
- private readonly ISet<InjectionPlan> entries = new MonotonicHashSet<InjectionPlan>();
- private readonly int numAlternatives;
- private readonly bool isAmbiguous;
- private readonly bool isInjectable;
-
- public SetInjectionPlan(INode name, ISet<InjectionPlan> entries) : base(name)
- {
- foreach (InjectionPlan ip in entries)
- {
- this.entries.Add(ip);
- }
- int numAlternatives = 1;
- bool isAmbiguous = false;
- bool isInjectable = true;
- foreach (InjectionPlan ip in entries)
- {
- numAlternatives *= ip.GetNumAlternatives();
- isAmbiguous |= ip.IsAmbiguous();
- isInjectable &= ip.IsInjectable();
- }
- this.numAlternatives = numAlternatives;
- this.isAmbiguous = isAmbiguous;
- this.isInjectable = isInjectable;
- }
-
- public override int GetNumAlternatives()
- {
- return numAlternatives;
- }
-
- public override bool IsAmbiguous()
- {
- return isAmbiguous;
- }
-
- public override bool IsInjectable()
- {
- return isInjectable;
- }
-
- //public override bool HasFutureDependency()
- //{
- // return false;
- //}
-
- public ISet<InjectionPlan> GetEntryPlans()
- {
- return new MonotonicHashSet<InjectionPlan>(this.entries);
- }
-
- public override string ToAmbiguousInjectString()
- {
- StringBuilder sb = new StringBuilder(GetNode().GetFullName() + "(set) includes ambiguous plans [");
- foreach (InjectionPlan ip in entries)
- {
- if(ip.IsAmbiguous())
- {
- sb.Append("\n" + ip.ToAmbiguousInjectString());
- }
- }
- sb.Append("]");
- return sb.ToString();
- }
-
- public override string ToInfeasibleInjectString()
- {
- StringBuilder sb = new StringBuilder(GetNode().GetFullName() + "(set) includes infeasible plans [");
- foreach (InjectionPlan ip in entries)
- {
- if(!ip.IsFeasible())
- {
- sb.Append("\n" + ip.ToInfeasibleInjectString());
- }
- }
- sb.Append("\n]");
- return sb.ToString();
- }
-
- public override bool IsInfeasibleLeaf()
- {
- return false;
- }
-
- public override string ToShallowString()
- {
- StringBuilder sb = new StringBuilder("set { ");
- foreach (InjectionPlan ip in entries)
- {
- sb.Append("\n" + ip.ToShallowString());
- }
- sb.Append("\n } ");
- return null;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Subplan.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Subplan.cs b/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Subplan.cs
deleted file mode 100644
index b0b0229..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/InjectionPlan/Subplan.cs
+++ /dev/null
@@ -1,235 +0,0 @@
-/**
- * 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.Collections.ObjectModel;
-using System.Linq;
-using System.Text;
-using Org.Apache.Reef.Utilities.Logging;
-using Org.Apache.Reef.Tang.Exceptions;
-using Org.Apache.Reef.Tang.Types;
-
-namespace Org.Apache.Reef.Tang.Implementations
-{
- public class Subplan : InjectionPlan
- {
- private static readonly Logger LOGGER = Logger.GetLogger(typeof(Subplan));
-
- InjectionPlan[] alternatives; //all implementatios on the same interface
- int numAlternatives;
- int selectedIndex; //the implementation that is bound
-
- public Subplan(INode n, int selectedIndex, InjectionPlan[] alternatives)
- : base(n)
- {
- this.alternatives = alternatives;
- if (selectedIndex < -1 || selectedIndex >= alternatives.Length)
- {
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IndexOutOfRangeException(), LOGGER);
- }
- this.selectedIndex = selectedIndex;
- if (selectedIndex != -1) //one was bound
- {
- this.numAlternatives = alternatives[selectedIndex].GetNumAlternatives();
- }
- else // no one was bound, but anyone could be used
- {
- int numAlternatives = 0;
- foreach (InjectionPlan a in alternatives)
- {
- numAlternatives += a.GetNumAlternatives();
- }
- this.numAlternatives = numAlternatives;
- }
- }
-
- public new ICollection<InjectionPlan> GetChildren()
- {
- return new ReadOnlyCollection<InjectionPlan>(this.alternatives.OfType<InjectionPlan>().ToList());
- }
-
- public Subplan(INode n, InjectionPlan[] alternatives)
- : this(n, -1, alternatives)
- {
- }
-
- public override int GetNumAlternatives()
- {
- return this.numAlternatives;
- }
-
- public override bool IsAmbiguous()
- {
- if (selectedIndex == -1)
- {
- return true;
- }
- return alternatives[selectedIndex].IsAmbiguous();
- }
-
- public override bool IsInjectable()
- {
- if (selectedIndex == -1)
- {
- return false;
- }
- else
- {
- return alternatives[selectedIndex].IsInjectable();
- }
- }
-
- public override string ToString()
- {
- if (alternatives.Length == 1)
- {
- return GetNode().GetName() + " = " + alternatives[0];
- }
- else if (alternatives.Length == 0)
- {
- return GetNode().GetName() + ": no injectable constructors";
- }
- StringBuilder sb = new StringBuilder("[");
- sb.Append(GetNode().GetName() + " = " + alternatives[0]);
- for (int i = 1; i < alternatives.Length; i++)
- {
- sb.Append(" | " + alternatives[i]);
- }
- sb.Append("]");
- return sb.ToString();
- }
-
- public override string ToShallowString()
- {
- if (alternatives.Length == 1)
- {
- return GetNode().GetName() + " = " + alternatives[0].ToShallowString();
- }
- else if (alternatives.Length == 0)
- {
- return GetNode().GetName() + ": no injectable constructors";
- }
- StringBuilder sb = new StringBuilder("[");
- sb.Append(GetNode().GetName() + " = " + alternatives[0].ToShallowString());
- for (int i = 1; i < alternatives.Length; i++)
- {
- sb.Append(" | " + alternatives[i].ToShallowString());
- }
- sb.Append("]");
- return sb.ToString();
- }
-
- public int GetSelectedIndex()
- {
- return selectedIndex;
- }
-
- public InjectionPlan GetDelegatedPlan()
- {
- if (selectedIndex != -1)
- {
- return alternatives[selectedIndex];
- }
- Org.Apache.Reef.Utilities.Diagnostics.Exceptions.Throw(new IllegalStateException("Error in getting GetDelegatedPlan."), LOGGER);
- return null;
- }
-
- //public override bool HasFutureDependency()
- //{
- // if (selectedIndex == -1)
- // {
- // throw new IllegalStateException("hasFutureDependency() called on ambiguous subplan!");
- // }
- // return alternatives[selectedIndex].HasFutureDependency();
- //}
-
- public override string ToAmbiguousInjectString()
- {
- if (alternatives.Length == 1)
- {
- return alternatives[0].ToAmbiguousInjectString();
- }
- else if (selectedIndex != -1)
- {
- return alternatives[selectedIndex].ToAmbiguousInjectString();
- }
- else
- {
- IList<InjectionPlan> alts = new List<InjectionPlan>();
- IList<InjectionPlan> ambig = new List<InjectionPlan>();
- foreach (InjectionPlan alt in alternatives)
- {
- if (alt.IsFeasible())
- {
- alts.Add(alt);
- }
- if (alt.IsAmbiguous())
- {
- ambig.Add(alt);
- }
- }
- StringBuilder sb = new StringBuilder("Ambiguous subplan " + GetNode().GetFullName());
- foreach (InjectionPlan alt in alts)
- {
- sb.Append("\n " + alt.ToShallowString() + " ");
- }
- foreach (InjectionPlan alt in ambig)
- {
- sb.Append("\n " + alt.ToShallowString() + " ");
- }
- sb.Append("\n]");
- return sb.ToString();
- }
- }
-
- public override string ToInfeasibleInjectString()
- {
- if (alternatives.Length == 1)
- {
- return alternatives[0].ToInfeasibleInjectString();
- }
- else if (alternatives.Length == 0)
- {
- return "No known implementations / injectable constructors for "
- + this.GetNode().GetFullName();
- }
- else if (selectedIndex != -1)
- {
- return alternatives[selectedIndex].ToInfeasibleInjectString();
- }
- else
- {
- return "Multiple infeasible plans: " + ToPrettyString();
- }
- }
-
- public InjectionPlan[] GetPlans()
- {
- InjectionPlan[] copy = new InjectionPlan[alternatives.Length];
- Array.Copy(alternatives, copy, alternatives.Length); // not sure if it does deep copy??
- return copy;
- }
-
- public override bool IsInfeasibleLeaf()
- {
- return false;
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Source/TANG/Tang/Implementations/Tang/TangFactory.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Source/TANG/Tang/Implementations/Tang/TangFactory.cs b/lang/cs/Source/TANG/Tang/Implementations/Tang/TangFactory.cs
deleted file mode 100644
index c54f562..0000000
--- a/lang/cs/Source/TANG/Tang/Implementations/Tang/TangFactory.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * 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;
-
-namespace Org.Apache.Reef.Tang.Implementations
-{
- public class TangFactory
- {
- public static ITang GetTang()
- {
- return new TangImpl();
- }
- }
-}