diff --git a/src/Spring/Spring.Core/Expressions/OpAND.cs b/src/Spring/Spring.Core/Expressions/OpAND.cs
index 2062a8e5..dcd5f42c 100644
--- a/src/Spring/Spring.Core/Expressions/OpAND.cs
+++ b/src/Spring/Spring.Core/Expressions/OpAND.cs
@@ -1,85 +1,93 @@
-#region License
-
-/*
- * Copyright © 2002-2005 the original author or authors.
- *
- * Licensed 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.
- */
-
-#endregion
-
-using System;
+#region License
+
+/*
+ * Copyright © 2002-2005 the original author or authors.
+ *
+ * Licensed 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.
+ */
+
+#endregion
+
+using System;
using System.Runtime.Serialization;
-using Spring.Util;
-
-namespace Spring.Expressions
-{
+using Spring.Util;
+
+namespace Spring.Expressions
+{
///
/// Represents AND operator (both, bitwise and logical).
- ///
- /// Aleksandar Seovic
- [Serializable]
- public class OpAND : BinaryOperator
- {
- ///
- /// Create a new instance
- ///
- public OpAND()
- {
- }
-
- ///
- /// Create a new instance
- ///
- public OpAND(BaseNode left, BaseNode right)
- :base(left, right)
- {
- }
-
- ///
- /// Create a new instance from SerializationInfo
- ///
- protected OpAND(SerializationInfo info, StreamingContext context)
- : base(info, context)
- {
- }
-
- ///
- /// Returns a value for the logical AND operator node.
- ///
- /// Context to evaluate expressions against.
- /// Current expression evaluation context.
+ ///
+ /// Aleksandar Seovic
+ [Serializable]
+ public class OpAND : BinaryOperator
+ {
+ ///
+ /// Create a new instance
+ ///
+ public OpAND()
+ {
+ }
+
+ ///
+ /// Create a new instance
+ ///
+ public OpAND(BaseNode left, BaseNode right)
+ :base(left, right)
+ {
+ }
+
+ ///
+ /// Create a new instance from SerializationInfo
+ ///
+ protected OpAND(SerializationInfo info, StreamingContext context)
+ : base(info, context)
+ {
+ }
+
+ ///
+ /// Returns a value for the logical AND operator node.
+ ///
+ /// Context to evaluate expressions against.
+ /// Current expression evaluation context.
/// Node's value.
- protected override object Get(object context, EvaluationContext evalContext)
- {
- object l = GetLeftValue(context, evalContext);
- object r = GetRightValue(context, evalContext);
-
- if (NumberUtils.IsInteger(l) && NumberUtils.IsInteger(r))
+ protected override object Get(object context, EvaluationContext evalContext)
+ {
+ object l = GetLeftValue(context, evalContext);
+
+ if (NumberUtils.IsInteger(l))
{
- return NumberUtils.BitwiseAnd(l, r);
+ object r = GetRightValue(context, evalContext);
+ if (NumberUtils.IsInteger(r))
+ {
+ return NumberUtils.BitwiseAnd(l, r);
+ }
}
- else if (l is Enum && l.GetType() == r.GetType())
+ else if (l is Enum)
{
- Type enumType = l.GetType();
- Type integralType = Enum.GetUnderlyingType(enumType);
- l = Convert.ChangeType(l, integralType);
- r = Convert.ChangeType(r, integralType);
- object result = NumberUtils.BitwiseAnd(l, r);
- return Enum.ToObject(enumType, result);
+ object r = GetRightValue(context, evalContext);
+ if (l.GetType() == r.GetType())
+ {
+ Type enumType = l.GetType();
+ Type integralType = Enum.GetUnderlyingType(enumType);
+ l = Convert.ChangeType(l, integralType);
+ r = Convert.ChangeType(r, integralType);
+ object result = NumberUtils.BitwiseAnd(l, r);
+ return Enum.ToObject(enumType, result);
+ }
}
- else
- return Convert.ToBoolean(l) && Convert.ToBoolean(r);
- }
- }
+
+ return Convert.ToBoolean(l) &&
+ Convert.ToBoolean(GetRightValue(context, evalContext));
+ }
+ }
}
\ No newline at end of file
diff --git a/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs b/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs
index 811eadba..73e7b23b 100644
--- a/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs
+++ b/test/Spring/Spring.Core.Tests/Expressions/ExpressionEvaluatorTests.cs
@@ -272,6 +272,13 @@ namespace Spring.Expressions
#endregion Serialization Tests
+ [Test(Description = "SPRNET-1381")]
+ public void TestShortcircuitAndOperator()
+ {
+ object boolean = ExpressionEvaluator.GetValue(new Inventor(), "Name != null and Name.Length == 0");
+ Assert.AreEqual(false, boolean);
+ }
+
[Test]
public void TestBitwiseXOR()
{