Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reuses ClassResolver and TypeConverter of old OgnlContext #353

Merged
merged 1 commit into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/java/ognl/Ognl.java
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ public static OgnlContext createDefaultContext(Object root, MemberAccess memberA
* appropriately
*/
public static OgnlContext addDefaultContext(Object root, OgnlContext context) {
return addDefaultContext(root, context.getMemberAccess(), null, null, context);
return addDefaultContext(root, context.getMemberAccess(), context.getClassResolver(), context.getTypeConverter(), context);
}

/**
Expand All @@ -282,7 +282,7 @@ public static OgnlContext addDefaultContext(Object root, OgnlContext context) {
* appropriately
*/
public static OgnlContext addDefaultContext(Object root, ClassResolver classResolver, OgnlContext context) {
return addDefaultContext(root, context.getMemberAccess(), classResolver, null, context);
return addDefaultContext(root, context.getMemberAccess(), classResolver, context.getTypeConverter(), context);
}

/**
Expand Down
166 changes: 162 additions & 4 deletions src/test/java/ognl/test/OgnlContextCreateTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,190 @@
*/
package ognl.test;

import junit.framework.TestCase;
import ognl.DefaultClassResolver;
import ognl.DefaultTypeConverter;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
import ognl.test.objects.Simple;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

public class OgnlContextCreateTest extends TestCase {
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

public void testCreateContext() throws OgnlException {
public class OgnlContextCreateTest {

@Test
public void createContext() throws OgnlException {
OgnlContext context = Ognl.createDefaultContext(null).withValues(prepareValues());

assertEquals("test100", Ognl.getValue("#test", context, new Simple()));
}

public void testCreateContextWithRoot() throws OgnlException {
@Test
public void createContextWithRoot() throws OgnlException {
Simple root = new Simple();

OgnlContext context = Ognl.createDefaultContext(root, prepareValues());

assertEquals("test100", Ognl.getValue("#test", context, root));
}

@Test
public void createContextWithNullRoot() throws OgnlException {
Simple root = new Simple();

OgnlContext context = Ognl.createDefaultContext(null, prepareValues());

assertEquals("test100", Ognl.getValue("#test", context, root));
}

@Test
public void createContextWithClassResolver() throws OgnlException {
Simple root = new Simple();

OgnlContext context = Ognl.createDefaultContext(root, new MyClassResolver());

assertEquals("static", Ognl.getValue("@ognl.test.MyClass@getValue()", context, root));
}

@Test
public void addContextWithClassResolver() throws OgnlException {
Simple root = new Simple();
OgnlContext oldContext = Ognl.createDefaultContext(root, new MyClassResolver());

OgnlContext context = Ognl.addDefaultContext(root, oldContext);

assertEquals("static", Ognl.getValue("@ognl.test.MyClass@getValue()", context, root));
}

@Test
public void createContextWithNullRootAndClassResolver() throws OgnlException {
Simple root = new Simple();

OgnlContext context = Ognl.createDefaultContext(null, new MyClassResolver());

assertEquals("static", Ognl.getValue("@ognl.test.MyClass@getValue()", context, root));
}

@Test
public void addContextWithNullRootAndClassResolver() throws OgnlException {
Simple root = new Simple();
OgnlContext oldContext = Ognl.createDefaultContext(null, new MyClassResolver());

OgnlContext context = Ognl.addDefaultContext(null, oldContext);

assertEquals("static", Ognl.getValue("@ognl.test.MyClass@getValue()", context, root));
}

@Test
public void createContextWithClassResolverAndTypeConverter() throws OgnlException {
Simple root = new Simple();
OgnlContext context = Ognl.createDefaultContext(root, new MyClassResolver(), new MyTypeConverter());

Simple actual = (Simple) Ognl.getValue("@ognl.test.MyClass@getValue()", context, root, Simple.class);

assertNotNull(actual);
assertArrayEquals(new Object[]{"static"}, actual.getValues());
}

@Test
public void addContextWithClassResolverAndTypeConverter() throws OgnlException {
Simple root = new Simple();
OgnlContext oldContext = Ognl.createDefaultContext(root, new MyClassResolver(), new MyTypeConverter());

OgnlContext context = Ognl.addDefaultContext(null, oldContext);

Simple actual = (Simple) Ognl.getValue("@ognl.test.MyClass@getValue()", context, root, Simple.class);

assertNotNull(actual);
assertArrayEquals(new Object[]{"static"}, actual.getValues());
}

@Test
public void addContextWithClassResolverAndNoTypeConverter() throws OgnlException {
Simple root = new Simple();
OgnlContext oldContext = Ognl.createDefaultContext(root, null, new MyTypeConverter());

OgnlContext context = Ognl.addDefaultContext(null, new MyClassResolver(), oldContext);

Simple actual = (Simple) Ognl.getValue("@ognl.test.MyClass@getValue()", context, root, Simple.class);

assertNotNull(actual);
assertArrayEquals(new Object[]{"static"}, actual.getValues());
}

@Test
public void addContextWithNoClassResolverAndNoTypeConverter() throws OgnlException {
Simple root = new Simple();
OgnlContext oldContext = Ognl.createDefaultContext(root);

OgnlContext context = Ognl.addDefaultContext(null, new MyClassResolver(), new MyTypeConverter(), oldContext);

Simple actual = (Simple) Ognl.getValue("@ognl.test.MyClass@getValue()", context, root, Simple.class);

assertNotNull(actual);
assertArrayEquals(new Object[]{"static"}, actual.getValues());
}

@Test
public void createContextWithNullRootAndClassResolverAndTypeConverter() throws OgnlException {
Simple root = new Simple();
OgnlContext context = Ognl.createDefaultContext(null, new MyClassResolver(), new MyTypeConverter());

Simple actual = (Simple) Ognl.getValue("@ognl.test.MyClass@getValue()", context, root, Simple.class);

assertNotNull(actual);
assertArrayEquals(new Object[]{"static"}, actual.getValues());
}

@Test
public void addContextWithNullRootAndClassResolverAndTypeConverter() throws OgnlException {
Simple root = new Simple();
OgnlContext oldContext = Ognl.createDefaultContext(null, new MyClassResolver(), new MyTypeConverter());

OgnlContext context = Ognl.addDefaultContext(null, oldContext);

Simple actual = (Simple) Ognl.getValue("@ognl.test.MyClass@getValue()", context, root, Simple.class);

assertNotNull(actual);
assertArrayEquals(new Object[]{"static"}, actual.getValues());
}

private Map<String, Object> prepareValues() {
Map<String, Object> values = new HashMap<>();
values.put("test", "test100");
return values;
}

private static class MyClassResolver extends DefaultClassResolver {
@Override
@SuppressWarnings("unchecked")
public <T> Class<T> classForName(String className, OgnlContext context) throws ClassNotFoundException {
if (className.equals("ognl.test.MyClass")) {
return (Class<T>) MyClass.class;
}
return super.classForName(className, context);
}
}

private static class MyClass {
public static String getValue() {
return "static";
}
}

private class MyTypeConverter extends DefaultTypeConverter {
@Override
public Object convertValue(OgnlContext context, Object value, Class<?> toType) {
if (toType == Simple.class) {
return new Simple(new Object[]{value});
}
return super.convertValue(context, value, toType);
}
}
}
49 changes: 49 additions & 0 deletions src/test/java/ognl/test/ShortCircuitingExpressionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package ognl.test;

import ognl.DefaultClassResolver;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
Expand Down Expand Up @@ -97,6 +98,37 @@ void shouldCompare() throws OgnlException {
assertEquals(Boolean.TRUE, val2);
}

@Test
void shouldUseTheSameClassResolver() throws OgnlException {
Object root = new Object();

OgnlContext ctx = Ognl.createDefaultContext(root, new MyClassResolver());

Object val1 = Ognl.getValue("@ognl.test.TestClass@getName()", ctx, root);
Object val2 = Ognl.getValue("@ognl.test.TestClass@getName()", ctx, (Object) null);

assertEquals("name", val1);
assertEquals("name", val2);
}

@Test
void shouldThrowExceptionWithWrongClassResolver() throws OgnlException {
Object root = new Object();

OgnlContext oldCtx = Ognl.createDefaultContext(root);
OgnlContext ctx = Ognl.addDefaultContext(root, new MyClassResolver(), oldCtx);

try {
Ognl.getValue("@ognl.test.TestClass@getName()", oldCtx, root);
fail();
} catch (OgnlException e) {
assertEquals("Method \"getName\" failed for object ognl.test.TestClass", e.getMessage());
}

Object val2 = Ognl.getValue("@ognl.test.TestClass@getName()", ctx, root);
assertEquals("name", val2);
}

private static Stream<Arguments> testValues() {
return Stream.of(
Arguments.of("#root ? someProperty : 99", 99),
Expand All @@ -112,4 +144,21 @@ private static Stream<Arguments> testValues() {
void setUp() {
context = Ognl.createDefaultContext(null);
}

private static class TestClass {
public static String getName() {
return "name";
}
}

private static class MyClassResolver extends DefaultClassResolver {
@Override
@SuppressWarnings("unchecked")
public <T> Class<T> classForName(String className, OgnlContext context) throws ClassNotFoundException {
if (className.equals("ognl.test.TestClass")) {
return (Class<T>) TestClass.class;
}
return super.classForName(className, context);
}
}
}
10 changes: 8 additions & 2 deletions src/test/java/ognl/test/objects/Simple.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
import java.util.HashMap;
import java.util.Map;

public class Simple extends Object {
public class Simple {

private String stringValue = "test";
private float floatValue;
private int intValue;
Expand All @@ -41,6 +42,7 @@ public class Simple extends Object {
private Object[] _array;

private Messages _messages;
private Object[] values;

public Simple() {
Map src = new HashMap();
Expand All @@ -58,7 +60,7 @@ public Simple(Bean2 bean) {
}

public Simple(Object[] values) {
super();
this.values = values;
}

public Simple(String stringValue, float floatValue, int intValue) {
Expand Down Expand Up @@ -182,6 +184,10 @@ public String getDisplayValue(int val) {
return "test";
}

public Object[] getValues() {
return values;
}

public boolean equals(Object other) {
boolean result = false;

Expand Down
Loading