📄 wrapper.java
字号:
namedProperties.put(prop.getName(), named); hasDispatch.put(prop.getName(), i); println("case " + i + ":"); pushDepth(); println("if (name" + n + " == null) {"); println(" name" + n + " = new " + name + "();"); println(" name" + n + ".value = value;"); if (isPublic) println(" name" + n + "._value = _value;"); println(" name" + n + ".hasDispatch = has" + n + ";"); println(" name" + n + ".setDispatch = set" + n + ";"); println(" name" + n + ".delId = " + n + ";"); println("}"); println("return name" + n + ";"); popDepth(); i += 1; ESMethodDescriptor md = prop.getNamedReadMethod(); if (md == null) return i; println("case " + i + ":"); pushDepth(); named.get = i; Method method = md.getMethod(); if (Modifier.isStatic(method.getModifiers()) && ! md.isStaticVirtual()) staticHasDispatch.put(prop.getName(), i - 1); Class resultClass = method.getReturnType(); print("return "); startJavaToES(resultClass); int p = startProp(md); if (p > 0) print(", "); print("name.toJavaString())"); endJavaToES(resultClass); println(";"); popDepth(); return i + 1; } private int doHasProperty(int i, ESPropertyDescriptor prop) throws IOException { Field field = prop.getESField(); ESMethodDescriptor md = prop.getESReadMethod(); if (field != null && ! Modifier.isPublic(field.getModifiers())) field = null; if (md == null && field == null) return i; hasDispatch.put(prop.getName(), i); println("case " + i + ":"); pushDepth(); if (field != null) { Class resultClass = field.getType(); print("return "); startJavaToES(resultClass); if (isPublic && field.getDeclaringClass().getName().equals(cl.getName())) print("_value."); else if (Modifier.isStatic(field.getModifiers())) print(toJavaClassName(field.getDeclaringClass().getName()) + "."); else print("((" + toJavaClassName(field.getDeclaringClass().getName()) + ") value)."); print(field.getName()); endJavaToES(resultClass); println(";"); popDepth(); if (Modifier.isStatic(field.getModifiers())) staticHasDispatch.put(prop.getName(), i); return i + 1; } Method method = md.getMethod(); if (Modifier.isStatic(method.getModifiers()) && ! md.isStaticVirtual()) staticHasDispatch.put(prop.getName(), i); print("return "); Class resultClass = method.getReturnType(); startJavaToES(resultClass); int p = startProp(md); print(")"); endJavaToES(resultClass); println(";"); popDepth(); return i + 1; } private void printSetProperty() throws IOException { println(); println("public void setProperty(ESString name, ESBase newValue)"); println(" throws Throwable"); println("{"); pushDepth(); println("ESBase temp;"); println("switch (setDispatch.get(name)) {"); PropertyDescriptor []props = beanInfo.getPropertyDescriptors(); int index = 0; for (int i = 0; i < props.length; i++) { if (props[i] instanceof NamedPropertyDescriptor) { index = doSetNamedProperty(index, (NamedPropertyDescriptor) props[i]); } else if (props[i] instanceof ESIndexedPropertyDescriptor) { index = doSetIndexProperty(index, (ESIndexedPropertyDescriptor) props[i]); } else if (props[i] instanceof ESPropertyDescriptor) index = doSetProperty(index, (ESPropertyDescriptor) props[i]); else throw new RuntimeException(); } println("default:"); println(" return;"); println("}"); popDepth(); println("}"); } private int doSetNamedProperty(int i, NamedPropertyDescriptor prop) throws IOException { Named named = (Named) namedProperties.get(prop.getName()); if (named == null) return i; int n = named.n; ESMethodDescriptor md = prop.getNamedWriteMethod(); if (md == null) return i; println("case " + i + ":"); pushDepth(); named.set = i; int p = startProp(md); Class []param = md.getParameterTypes(); if (p != 0) print(", "); print("name.toJavaString(), "); printValueToJava(param[1], "newValue"); println(");"); println("return;"); popDepth(); return i + 1; } private int doSetIndexProperty(int i, ESIndexedPropertyDescriptor prop) throws IOException { Named named = (Named) namedProperties.get(prop.getName()); if (named == null) return i; int n = named.n; ESMethodDescriptor md = prop.getESWriteMethod(); if (md == null) return i; println("case " + i + ":"); pushDepth(); named.set = i; int p = startProp(md); Class []param = md.getParameterTypes(); if (p != 0) print(", "); print("name.toInt32(), "); printValueToJava(param[1], "newValue"); println(");"); println("return;"); popDepth(); return i + 1; } private int doSetProperty(int i, ESPropertyDescriptor prop) throws IOException { ESMethodDescriptor md = prop.getESWriteMethod(); Field field = prop.getESField(); if (field != null && Modifier.isFinal(field.getModifiers())) field = null; if (md == null && field == null) return i; println("case " + i + ":"); pushDepth(); setDispatch.put(prop.getName(), i); if (field != null) { Class resultClass = field.getType(); if (isPublic) print("_value."); else print("((" + field.getDeclaringClass().getName() + ") value)."); print(field.getName()); print(" = "); printValueToJava(resultClass, "newValue"); println(";"); println("return;"); popDepth(); return i + 1; } Method method = md.getMethod(); if (Modifier.isStatic(method.getModifiers()) && ! md.isStaticVirtual()) staticSetDispatch.put(prop.getName(), i); Class []param = md.getParameterTypes(); int p = startProp(md); if (p != 0) print(", "); printValueToJava(param[0], "newValue"); println(");"); println("return;"); popDepth(); return i + 1; } private void printKeys() throws IOException { println(); println("public java.util.Iterator keys()"); println(" throws Throwable"); println("{"); pushDepth(); println("switch (delId) {"); ESMethodDescriptor md = beanInfo.iterator; if (md != null) { println("case -1:"); print(" return Call.toESIterator("); startProp(md); println("));"); } PropertyDescriptor []props = beanInfo.getPropertyDescriptors(); for (int i = 0; i < props.length; i++) { if (props[i] instanceof NamedPropertyDescriptor) printNamedKey((NamedPropertyDescriptor) props[i]); } println("default:"); println(" return super.keys();"); println("}"); popDepth(); println("}"); } private void printNamedKey(NamedPropertyDescriptor prop) throws IOException { ESMethodDescriptor md = prop.getNamedIteratorMethod(); if (md == null) return; Named named = (Named) namedProperties.get(prop.getName()); println("case " + named.n + ":"); pushDepth(); print("return Call.toESIterator("); int p = startProp(md); println("));"); popDepth(); } private void printDeletes() throws IOException { println(); println("public ESBase delete(ESString key)"); println(" throws Throwable"); println("{"); pushDepth(); println("switch (delId) {"); PropertyDescriptor []props = beanInfo.getPropertyDescriptors(); for (int i = 0; i < props.length; i++) { if (props[i] instanceof NamedPropertyDescriptor) printNamedDelete((NamedPropertyDescriptor) props[i]); } println("default:"); println(" return ESBoolean.FALSE;"); println("}"); popDepth(); println("}"); } private void printNamedDelete(NamedPropertyDescriptor prop) throws IOException { ESMethodDescriptor md = prop.getNamedRemoveMethod(); if (md == null) return; Named named = (Named) namedProperties.get(prop.getName()); println("case " + named.n + ":"); pushDepth(); int p = startProp(md); if (p > 0) print(", "); println("key.toJavaString());"); println("return ESBoolean.TRUE;"); popDepth(); } /** * Prints all the accessible methods in this object. */ private void printMethods() throws IOException { println(); println("public ESBase call(Call call, int length, int n)"); println(" throws Throwable"); println("{"); pushDepth(); println("ESBase temp;"); println("switch (n) {"); ArrayList overload = (ArrayList) beanInfo._methodMap.get("call"); if (overload != null) printMethod(-1, "call", overload, null); // Print the constructor (code -2) ArrayList create = (ArrayList) beanInfo._staticMethodMap.get("create"); ArrayList call = (ArrayList) beanInfo._staticMethodMap.get("call"); if (create != null) printMethod(-2, "create", create, null); else if (call != null) printMethod(-2, "call", create, null); else { println("case -2:"); println(" return construct(call, length);"); } Iterator iter = beanInfo._methodMap.entrySet().iterator(); int i = 0; while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); overload = (ArrayList) entry.getValue(); String name = (String) entry.getKey(); i = printMethod(i, name, overload, methodDispatch); } iter = beanInfo._staticMethodMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); overload = (ArrayList) entry.getValue(); String name = (String) entry.getKey(); i = printMethod(i, name, overload, staticMethodDispatch); } println("}"); println("return ESBase.esUndefined;"); popDepth(); println("}"); } /** * Prints a method in a method dispatch. */ private int printMethod(int i, String name, ArrayList overload, IntMap dispatch) throws IOException { ESMethodDescriptor []last = null; if (overload == null) return i; for (int j = 0; j < overload.size(); j++) { last = (ESMethodDescriptor []) overload.get(j); } if (last == null) { return i; } if (i > -100) { println("case " + i + ":"); pushDepth(); if (dispatch != null) dispatch.put(name, i++); } if (overload.size() > 2) { ESMethodDescriptor []mds = (ESMethodDescriptor []) overload.get(2); for (int j = 0; mds != null && j < mds.length; j++) { Class []cl = mds[j].getParameterTypes(); int p = cl.length - 2; if (cl[0].getName().equals("com.caucho.es.Call") && cl[1].getName().equals("int")) { printMethod(mds[j], dispatch == null); popDepth(); return i; } } } for (int j = 0; j < overload.size(); j++) { Object o = overload.get(j); if (o == null) continue; ESMethodDescriptor []mds = (ESMethodDescriptor []) o; if (mds != last) { println("if (length <= " + j + ") {"); pushDepth(); } if (mds.length == 1) printMethod(mds[0], dispatch == null); else { String var = "dispatch" + overloadDispatch.size(); overloadDispatch.add(mds); println("switch (" + var + ".select(call, length)) {"); for (int k = 0; k < mds.length; k++) { println("case " + k + ":"); pushDepth(); printMethod(mds[k], dispatch == null); popDepth(); } println("default:"); println(" throw new ESException(\"no matching method " + mds[0].getName() + "\");"); println("}"); } if (mds != last) { popDepth(); println("}"); } } if (i > -100) { popDepth(); } return i; } /** * Print a single method based on a method descriptor. The arguments * are assumed to come from a Call object. * * @param md the method descriptor. */ private void printMethod(ESMethodDescriptor md, boolean isProp) throws IOException { boolean hasThrowable = hasException(md.getMethod().getExceptionTypes(), Throwable.class); /* if (hasThrowable) { println("try {"); pushDepth(); } */ Class returnCl = md.getReturnType(); if (! returnCl.getName().equals("void")) { print("return "); startJavaToES(returnCl); } Class []param = md.getParameterTypes(); int p; if (isProp) p = startProp(md); else p = startCall(md); if (param.length == 2 && param[0].getName().equals("com.caucho.es.Call") && param[1].getName().equals("int")) { if (p > 0) print(", "); print("call, length"); } else { for (int j = 0; j < param.length; j++) { if (j + p > 0) print(", "); printArgToJava(param[j], j); } } if (returnCl.getName().equals("void")) { println(");"); println("return ESBase.esUndefined;"); } else { print(")"); endJavaToES(returnCl); println(";"); } /* if (hasThrowable) { popDepth(); println("} catch (Exception e) {"); println(" throw e;"); println("} catch (RuntimeException e) {"); println(" throw e;"); println("} catch (Error e) {");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -