Skip to content

Commit

Permalink
Merge pull request #11 from danielfernandez/replace
Browse files Browse the repository at this point in the history
Optimization: avoid using java.lang.String#replaceAll() in most cases
  • Loading branch information
lukaszlenart committed May 17, 2015
2 parents 4a8978e + 182c9a9 commit 0192a5d
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 18 deletions.
9 changes: 6 additions & 3 deletions src/java/ognl/ASTAdd.java
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,8 @@ && isWider((NodeType)_children[i], lastType))
if (context.getCurrentType() != null && context.getCurrentType() == Character.class
&& ASTConst.class.isInstance(_children[i]))
{
expr = expr.replaceAll("'", "\"");
if (expr.indexOf('\'') >= 0)
expr = expr.replaceAll("'", "\"");
context.setCurrentType(String.class);
} else {

Expand All @@ -240,8 +241,10 @@ && isWider((NodeType)_children[i], lastType))
if (lastType != null && String.class.isAssignableFrom(lastType.getGetterClass()))
{
//System.out.println("Input expr >>" + expr + "<<");
expr = expr.replaceAll("&quot;", "\"");
expr = expr.replaceAll("\"", "'");
if (expr.indexOf("&quot;") >= 0)
expr = expr.replaceAll("&quot;", "\"");
if (expr.indexOf('"') >= 0)
expr = expr.replaceAll("\"", "'");
expr = "\"" + expr + "\"";
//System.out.println("Expr now >>" + expr + "<<");
}
Expand Down
11 changes: 8 additions & 3 deletions src/java/ognl/ListPropertyAccessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ public void setProperty(Map context, Object target, Object name, Object value)
public Class getPropertyClass(OgnlContext context, Object target, Object index)
{
if (index instanceof String) {
String key = ((String)index).replaceAll("\"", "");
String indexStr = (String)index;
String key = (indexStr.indexOf('"') >= 0? indexStr.replaceAll("\"", "") : indexStr);
if (key.equals("size")) {
return int.class;
} else {
Expand All @@ -155,7 +156,9 @@ public Class getPropertyClass(OgnlContext context, Object target, Object index)

public String getSourceAccessor(OgnlContext context, Object target, Object index)
{
String indexStr = index.toString().replaceAll("\"", "");
String indexStr = index.toString();
if (indexStr.indexOf('"') >= 0)
indexStr = indexStr.replaceAll("\"", "");

if (String.class.isInstance(index))
{
Expand Down Expand Up @@ -225,7 +228,9 @@ public String getSourceAccessor(OgnlContext context, Object target, Object index

public String getSourceSetter(OgnlContext context, Object target, Object index)
{
String indexStr = index.toString().replaceAll("\"", "");
String indexStr = index.toString();
if (indexStr.indexOf('"') >= 0)
indexStr = indexStr.replaceAll("\"", "");

// TODO: This feels really inefficient, must be some better way
// check if the index string represents a method on a custom class implementing java.util.List instead..
Expand Down
4 changes: 2 additions & 2 deletions src/java/ognl/MapPropertyAccessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ public String getSourceAccessor(OgnlContext context, Object target, Object index

if (String.class.isInstance(index) && !indexedAccess)
{
String key = indexStr.replaceAll("\"", "");
String key = (indexStr.indexOf('"') >= 0? indexStr.replaceAll("\"", "") : indexStr);

if (key.equals("size")) {
context.setCurrentType(int.class);
Expand Down Expand Up @@ -142,7 +142,7 @@ public String getSourceSetter(OgnlContext context, Object target, Object index)

if (String.class.isInstance(index))
{
String key = indexStr.replaceAll("\"", "");
String key = (indexStr.indexOf('"') >= 0? indexStr.replaceAll("\"", "") : indexStr);

if (key.equals("size"))
return "";
Expand Down
17 changes: 12 additions & 5 deletions src/java/ognl/ObjectPropertyAccessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,8 @@ public Class getPropertyClass(OgnlContext context, Object target, Object index)
if (m == null) {

if (String.class.isAssignableFrom(index.getClass()) && !target.getClass().isArray()) {
String key = ((String) index).replaceAll("\"", "");
String indexStr = (String)index;
String key = (indexStr.indexOf('"') >= 0)? indexStr.replaceAll("\"", "") : indexStr;
try {
Field f = target.getClass().getField(key);
if (f != null) {
Expand All @@ -202,13 +203,17 @@ public String getSourceAccessor(OgnlContext context, Object target, Object index
{
try {

String methodName = index.toString().replaceAll("\"", "");
String indexStr = index.toString();
String methodName = (indexStr.indexOf('"') >= 0? indexStr.replaceAll("\"", "") : indexStr);
Method m = OgnlRuntime.getReadMethod(target.getClass(), methodName);

// try last ditch effort of checking if they were trying to do reflection via a return method value

if (m == null && context.getCurrentObject() != null)
m = OgnlRuntime.getReadMethod(target.getClass(), context.getCurrentObject().toString().replaceAll("\"", ""));
{
String currentObjectStr = context.getCurrentObject().toString();
m = OgnlRuntime.getReadMethod(target.getClass(), (currentObjectStr.indexOf('"') >= 0? currentObjectStr.replaceAll("\"", "") : currentObjectStr));
}

//System.out.println("tried to get read method from target: " + target.getClass() + " with methodName:" + methodName + " result: " + m);
// try to get field if no method could be found
Expand Down Expand Up @@ -252,13 +257,15 @@ public String getSourceSetter(OgnlContext context, Object target, Object index)
{
try {

String methodName = index.toString().replaceAll("\"", "");
String indexStr = index.toString();
String methodName = (indexStr.indexOf('"') >= 0? indexStr.replaceAll("\"", "") : indexStr);
Method m = OgnlRuntime.getWriteMethod(target.getClass(), methodName);

if (m == null && context.getCurrentObject() != null
&& context.getCurrentObject().toString() != null)
{
m = OgnlRuntime.getWriteMethod(target.getClass(), context.getCurrentObject().toString().replaceAll("\"", ""));
String currentObjectStr = context.getCurrentObject().toString();
m = OgnlRuntime.getWriteMethod(target.getClass(), (currentObjectStr.indexOf('"') >= 0? currentObjectStr.replaceAll("\"", "") : currentObjectStr));
}

if (m == null || m.getParameterTypes() == null || m.getParameterTypes().length <= 0)
Expand Down
8 changes: 6 additions & 2 deletions src/java/ognl/OgnlRuntime.java
Original file line number Diff line number Diff line change
Expand Up @@ -2675,7 +2675,10 @@ public static Method getReadMethod(Class target, String name)
public static Method getReadMethod(Class target, String name, int numParms)
{
try {
name = name.replaceAll("\"", "").toLowerCase();
if (name.indexOf('"') >= 0)
name = name.replaceAll("\"", "");

name = name.toLowerCase();

BeanInfo info = Introspector.getBeanInfo(target);
MethodDescriptor[] methods = info.getMethodDescriptors();
Expand Down Expand Up @@ -2763,7 +2766,8 @@ public static Method getWriteMethod(Class target, String name)
public static Method getWriteMethod(Class target, String name, int numParms)
{
try {
name = name.replaceAll("\"", "");
if (name.indexOf('"') >= 0)
name = name.replaceAll("\"", "");

BeanInfo info = Introspector.getBeanInfo(target);
MethodDescriptor[] methods = info.getMethodDescriptors();
Expand Down
9 changes: 6 additions & 3 deletions src/java/ognl/enhance/ExpressionCompiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -546,7 +546,8 @@ protected String generateGetter(OgnlContext context, CtClass newClass, CtClass o
+ ";}";
}

body = body.replaceAll("\\.\\.", ".");
if (body.indexOf("..") >= 0)
body = body.replaceAll("\\.\\.", ".");

// System.out.println("Getter Body: ===================================\n" + body);
valueGetter.setBody(body);
Expand Down Expand Up @@ -586,7 +587,8 @@ void createLocalReferences(OgnlContext context, ClassPool pool, CtClass clazz, C
body += " return " + widener + ref.getExpression() + ";";
body += "}";

body = body.replaceAll("\\.\\.", ".");
if (body.indexOf("..") >= 0)
body = body.replaceAll("\\.\\.", ".");

// System.out.println("adding method " + ref.getName() + " with body:\n" + body + " and return type: " + ref.getType());

Expand Down Expand Up @@ -634,7 +636,8 @@ protected String generateSetter(OgnlContext context, CtClass newClass, CtClass o
+ pre
+ setterCode + ";}";

body = body.replaceAll("\\.\\.", ".");
if (body.indexOf("..") >= 0)
body = body.replaceAll("\\.\\.", ".");

// System.out.println("Setter Body: ===================================\n" + body);

Expand Down

0 comments on commit 0192a5d

Please sign in to comment.