|
|
@@ -81,56 +81,60 @@ public class ResolvePattern implements Serializable {
|
|
|
}
|
|
|
|
|
|
public Object get(Object that) {
|
|
|
+ ResolveStatus status = new ResolveStatus();
|
|
|
for(int i=0,n=tokens.length-1; i<n; i++) {
|
|
|
- that = iget(handler, that, tokens[i]);
|
|
|
- if(handler.failed()) {
|
|
|
+ that = iget(status, that, tokens[i]);
|
|
|
+ if(status.error) {
|
|
|
return handler.get(this, tokens[i]);
|
|
|
}
|
|
|
}
|
|
|
- Object out = iget(handler, that, tokens[tokens.length-1]);
|
|
|
- if(handler.failed()) {
|
|
|
+ Object out = iget(status, that, tokens[tokens.length-1]);
|
|
|
+ if(status.error) {
|
|
|
return handler.get(this);
|
|
|
}
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
public void set(Object that, Object value) {
|
|
|
+ ResolveStatus status = new ResolveStatus();
|
|
|
for(int i=0,n=tokens.length-1; i<n; i++) {
|
|
|
- that = iget(handler, that, tokens[i]);
|
|
|
- if(handler.failed()) {
|
|
|
+ that = iget(status, that, tokens[i]);
|
|
|
+ if(status.error) {
|
|
|
handler.get(this, tokens[i]);
|
|
|
}
|
|
|
}
|
|
|
- iset(handler, that, tokens[tokens.length-1], value);
|
|
|
- if(handler.failed()) {
|
|
|
+ iset(status, that, tokens[tokens.length-1], value);
|
|
|
+ if(status.error) {
|
|
|
handler.set(this);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public Object replace(Object that, Object value) {
|
|
|
+ ResolveStatus status = new ResolveStatus();
|
|
|
for(int i=0,n=tokens.length-1; i<n; i++) {
|
|
|
- that = iget(handler, that, tokens[i]);
|
|
|
- if(handler.failed()) {
|
|
|
+ that = iget(status, that, tokens[i]);
|
|
|
+ if(status.error) {
|
|
|
handler.get(this, tokens[i]);
|
|
|
}
|
|
|
}
|
|
|
- Object out = ireplace(handler, that, tokens[tokens.length-1], value);
|
|
|
- if(handler.failed()) {
|
|
|
+ Object out = ireplace(status, that, tokens[tokens.length-1], value);
|
|
|
+ if(status.error) {
|
|
|
return handler.replace(this);
|
|
|
}
|
|
|
return out;
|
|
|
}
|
|
|
|
|
|
public IClass<?> type(Object that) {
|
|
|
+ ResolveStatus status = new ResolveStatus();
|
|
|
IClass<?> type = IClass.typefor(that);
|
|
|
for(int i=0,n=tokens.length-1; i<n; i++) {
|
|
|
- type = itype(handler, type, tokens[i]);
|
|
|
- if(handler.failed()) {
|
|
|
+ type = itype(status, type, tokens[i]);
|
|
|
+ if(status.error) {
|
|
|
return handler.type(this, tokens[i]);
|
|
|
}
|
|
|
}
|
|
|
- IClass<?> out = itype(handler, type, tokens[tokens.length-1]);
|
|
|
- if(handler.failed()) {
|
|
|
+ IClass<?> out = itype(status, type, tokens[tokens.length-1]);
|
|
|
+ if(status.error) {
|
|
|
return handler.type(this);
|
|
|
}
|
|
|
return out;
|
|
|
@@ -140,43 +144,43 @@ public class ResolvePattern implements Serializable {
|
|
|
return new RWrapper(that);
|
|
|
}
|
|
|
|
|
|
- private Object iget(ResolveStrategy handler, Object that, String name) {
|
|
|
+ private Object iget(ResolveStatus status, Object that, String name) {
|
|
|
for(Model m : MODELS) {
|
|
|
if(m.matches(that)) {
|
|
|
- return m.get(handler, that, name);
|
|
|
+ return m.get(status, that, name);
|
|
|
}
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- private void iset(ResolveStrategy handler, Object that, String name, Object value) {
|
|
|
+ private void iset(ResolveStatus status, Object that, String name, Object value) {
|
|
|
for(Model m : MODELS) {
|
|
|
if(m.matches(that)) {
|
|
|
- m.set(handler, that, name, value);
|
|
|
+ m.set(status, that, name, value);
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
}
|
|
|
|
|
|
- private Object ireplace(ResolveStrategy handler, Object that, String name, Object value) {
|
|
|
+ private Object ireplace(ResolveStatus status, Object that, String name, Object value) {
|
|
|
for(Model m : MODELS) {
|
|
|
if(m.matches(that)) {
|
|
|
- return m.replace(handler, that, name, value);
|
|
|
+ return m.replace(status, that, name, value);
|
|
|
}
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- private IClass<?> itype(ResolveStrategy handler, IClass<?> that, String name) {
|
|
|
+ private IClass<?> itype(ResolveStatus status, IClass<?> that, String name) {
|
|
|
for(Model m : MODELS) {
|
|
|
if(m.matchesType(that)) {
|
|
|
- return m.type(handler, that, name);
|
|
|
+ return m.type(status, that, name);
|
|
|
}
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@@ -198,19 +202,19 @@ public class ResolvePattern implements Serializable {
|
|
|
return IAttribute.ARRAY.matches(that);
|
|
|
}
|
|
|
@Override
|
|
|
- public Object get(ResolveStrategy _h, Object that, String name) {
|
|
|
+ public Object get(ResolveStatus _s, Object that, String name) {
|
|
|
return NativeArray.wrap(that).get(Integer.parseInt(name));
|
|
|
}
|
|
|
@Override
|
|
|
- public void set(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public void set(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
NativeArray.wrap(that).set(Integer.parseInt(name), value);
|
|
|
}
|
|
|
@Override
|
|
|
- public Object replace(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public Object replace(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
return NativeArray.wrap(that).replace(Integer.parseInt(name), value);
|
|
|
}
|
|
|
@Override
|
|
|
- public IClass<?> type(ResolveStrategy _h, IClass<?> that, String name) {
|
|
|
+ public IClass<?> type(ResolveStatus _s, IClass<?> that, String name) {
|
|
|
return that.component();
|
|
|
}
|
|
|
},
|
|
|
@@ -224,17 +228,17 @@ public class ResolvePattern implements Serializable {
|
|
|
return that!=IClass.NULL && RCompareUtils.isRawSuper(IClass.typeinfo(List.class), that);
|
|
|
}
|
|
|
@Override
|
|
|
- public Object get(ResolveStrategy _h, Object that, String name) {
|
|
|
+ public Object get(ResolveStatus _s, Object that, String name) {
|
|
|
return ((List<?>)that).get(Integer.parseInt(name));
|
|
|
}
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- public void set(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public void set(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
((List<Object>)that).set(Integer.parseInt(name), value);
|
|
|
}
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- public Object replace(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public Object replace(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
List<Object> list = (List<Object>)that;
|
|
|
int index = Integer.parseInt(name);
|
|
|
Object prv = list.get(index);
|
|
|
@@ -242,7 +246,7 @@ public class ResolvePattern implements Serializable {
|
|
|
return prv;
|
|
|
}
|
|
|
@Override
|
|
|
- public IClass<?> type(ResolveStrategy _h, IClass<?> that, String name) {
|
|
|
+ public IClass<?> type(ResolveStatus _s, IClass<?> that, String name) {
|
|
|
return that.params().get(0);
|
|
|
}
|
|
|
},
|
|
|
@@ -256,21 +260,21 @@ public class ResolvePattern implements Serializable {
|
|
|
return that!=IClass.NULL && RCompareUtils.isRawSuper(IClass.typeinfo(Map.class), that);
|
|
|
}
|
|
|
@Override
|
|
|
- public Object get(ResolveStrategy _h, Object that, String name) {
|
|
|
+ public Object get(ResolveStatus _s, Object that, String name) {
|
|
|
return ((Map<?,?>)that).get(name);
|
|
|
}
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- public void set(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public void set(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
((Map<String,Object>)that).put(name, value);
|
|
|
}
|
|
|
@Override
|
|
|
@SuppressWarnings("unchecked")
|
|
|
- public Object replace(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public Object replace(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
return ((Map<String,Object>)that).put(name, value);
|
|
|
}
|
|
|
@Override
|
|
|
- public IClass<?> type(ResolveStrategy _h, IClass<?> that, String name) {
|
|
|
+ public IClass<?> type(ResolveStatus _s, IClass<?> that, String name) {
|
|
|
return that.params().get(1);
|
|
|
}
|
|
|
},
|
|
|
@@ -284,7 +288,7 @@ public class ResolvePattern implements Serializable {
|
|
|
return that!=IClass.NULL && IClass.typeinfo(Matcher.class).isSuper(that);
|
|
|
}
|
|
|
@Override
|
|
|
- public Object get(ResolveStrategy _h, Object that, String name) {
|
|
|
+ public Object get(ResolveStatus _s, Object that, String name) {
|
|
|
if(StringTraits.isNumber(name)) {
|
|
|
return ((Matcher)that).group(Integer.parseInt(name));
|
|
|
} else {
|
|
|
@@ -292,15 +296,15 @@ public class ResolvePattern implements Serializable {
|
|
|
}
|
|
|
}
|
|
|
@Override
|
|
|
- public void set(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public void set(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
throw new UnsupportedOperationException("Matcher is immutable.");
|
|
|
}
|
|
|
@Override
|
|
|
- public Object replace(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public Object replace(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
throw new UnsupportedOperationException("Matcher is immutable.");
|
|
|
}
|
|
|
@Override
|
|
|
- public IClass<?> type(ResolveStrategy _h, IClass<?> that, String name) {
|
|
|
+ public IClass<?> type(ResolveStatus _s, IClass<?> that, String name) {
|
|
|
return IClass.typeinfo(String.class);
|
|
|
}
|
|
|
},
|
|
|
@@ -314,19 +318,19 @@ public class ResolvePattern implements Serializable {
|
|
|
return that!=IClass.NULL && IClass.typeinfo(CharSequence.class).isSuper(that);
|
|
|
}
|
|
|
@Override
|
|
|
- public Object get(ResolveStrategy _h, Object that, String name) {
|
|
|
+ public Object get(ResolveStatus _s, Object that, String name) {
|
|
|
return ((CharSequence)that).charAt(Integer.parseInt(name));
|
|
|
}
|
|
|
@Override
|
|
|
- public void set(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public void set(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
throw new UnsupportedOperationException("CharSequence is immutable.");
|
|
|
}
|
|
|
@Override
|
|
|
- public Object replace(ResolveStrategy _h, Object that, String name, Object value) {
|
|
|
+ public Object replace(ResolveStatus _s, Object that, String name, Object value) {
|
|
|
throw new UnsupportedOperationException("CharSequence is immutable.");
|
|
|
}
|
|
|
@Override
|
|
|
- public IClass<?> type(ResolveStrategy _h, IClass<?> that, String name) {
|
|
|
+ public IClass<?> type(ResolveStatus _s, IClass<?> that, String name) {
|
|
|
return IClass.typeinfo(char.class);
|
|
|
}
|
|
|
},
|
|
|
@@ -340,7 +344,7 @@ public class ResolvePattern implements Serializable {
|
|
|
return that!=IClass.NULL;
|
|
|
}
|
|
|
@Override
|
|
|
- public Object get(ResolveStrategy handler, Object that, String name) {
|
|
|
+ public Object get(ResolveStatus status, Object that, String name) {
|
|
|
BeanModel model = BeanModel.typefor(that);
|
|
|
if(model.properties().containsKey(name)) {
|
|
|
return model.property(name).get().get(that);
|
|
|
@@ -349,7 +353,7 @@ public class ResolvePattern implements Serializable {
|
|
|
if(f.hasNext()) {
|
|
|
return f.next().get(that);
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
@@ -358,7 +362,7 @@ public class ResolvePattern implements Serializable {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void set(ResolveStrategy handler, Object that, String name, Object value) {
|
|
|
+ public void set(ResolveStatus status, Object that, String name, Object value) {
|
|
|
BeanModel model = BeanModel.typefor(that);
|
|
|
if(model.properties().containsKey(name)) {
|
|
|
model.property(name).get().set(that, value);
|
|
|
@@ -369,10 +373,10 @@ public class ResolvePattern implements Serializable {
|
|
|
f.next().set(that, value);
|
|
|
return;
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
}
|
|
|
@Override
|
|
|
- public Object replace(ResolveStrategy handler, Object that, String name, Object value) {
|
|
|
+ public Object replace(ResolveStatus status, Object that, String name, Object value) {
|
|
|
BeanModel model = BeanModel.typefor(that);
|
|
|
if(model.properties().containsKey(name)) {
|
|
|
return model.property(name).get().replace(that, value);
|
|
|
@@ -381,11 +385,11 @@ public class ResolvePattern implements Serializable {
|
|
|
if(f.hasNext()) {
|
|
|
return f.next().replace(that, value);
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
return null;
|
|
|
}
|
|
|
@Override
|
|
|
- public IClass<?> type(ResolveStrategy handler, IClass<?> that, String name) {
|
|
|
+ public IClass<?> type(ResolveStatus status, IClass<?> that, String name) {
|
|
|
BeanModel model = BeanModel.typeinfo(that);
|
|
|
if(model.properties().containsKey(name)) {
|
|
|
return model.property(name).get().type();
|
|
|
@@ -394,7 +398,7 @@ public class ResolvePattern implements Serializable {
|
|
|
if(f.hasNext()) {
|
|
|
return f.next().type();
|
|
|
}
|
|
|
- handler.failure();
|
|
|
+ status.error = true;
|
|
|
return null;
|
|
|
}
|
|
|
};
|
|
|
@@ -403,13 +407,13 @@ public class ResolvePattern implements Serializable {
|
|
|
|
|
|
public abstract boolean matches(Object that);
|
|
|
|
|
|
- public abstract Object get(ResolveStrategy handler, Object that, String name);
|
|
|
+ public abstract Object get(ResolveStatus status, Object that, String name);
|
|
|
|
|
|
- public abstract void set(ResolveStrategy handler, Object that, String name, Object value);
|
|
|
+ public abstract void set(ResolveStatus status, Object that, String name, Object value);
|
|
|
|
|
|
- public abstract Object replace(ResolveStrategy handler, Object that, String name, Object value);
|
|
|
+ public abstract Object replace(ResolveStatus status, Object that, String name, Object value);
|
|
|
|
|
|
- public abstract IClass<?> type(ResolveStrategy handler, IClass<?> that, String name);
|
|
|
+ public abstract IClass<?> type(ResolveStatus status, IClass<?> that, String name);
|
|
|
|
|
|
}
|
|
|
|
|
|
@@ -443,6 +447,11 @@ public class ResolvePattern implements Serializable {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private static final class ResolveStatus {
|
|
|
+
|
|
|
+ public boolean error;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
|
|
|
}
|