/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* 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.
*/
package scouter.jdbc;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Generator {
public static void main(String[] args) throws Exception {
// String className = "ScouterConnection";
// String superName =null;
// String innerName = "java.sql.Connection";
// String className = "ScouterStatement";
// String superName = null;
// String innerName = "java.sql.Statement";
// String className = "ScouterPreparedStatement";
// String superName = "ScouterStatement";
// String innerName = "java.sql.PreparedStatement";
// String className = "ScouterCallableStatement";
// String superName = "ScouterPreparedStatement";
// String innerName = "java.sql.CallableStatement";
String className = "ScouterResultSet";
String superName = null;
String innerName = "java.sql.ResultSet";
Class target = Class.forName(innerName);
if (superName == null) {
System.out.println("public class " + className + " implements " + innerName + " {");
} else {
System.out.println("public class " + className + " extends " + superName + " implements " + innerName
+ " {");
}
System.out.println(" " + innerName + " inner;");
System.out.println(" public " + className + "(" + innerName + " inner){");
if (superName != null) {
System.out.println(" super(inner);");
}
System.out.println(" this.inner=inner;");
System.out.println(" }");
Method[] m = target.getMethods();
for (int i = 0; i < m.length; i++) {
boolean isVoid = m[i].getReturnType().toString().endsWith("void");
System.out.println(" " + getMethodString(m[i]) + "{");
System.out.println(" " + getInnerString(m[i]));
System.out.println(" }");
}
System.out.println("}");
}
public static String getMethodString(Method m) {
try {
StringBuilder sb = new StringBuilder();
int mod = m.getModifiers();
if (mod != 0) {
if (Modifier.isAbstract(mod)) {
mod ^= Modifier.ABSTRACT;
}
sb.append("final " + Modifier.toString(mod)).append(" ");
}
sb.append(getTypeName(m.getReturnType())).append(' ');
sb.append(m.getName()).append('(');
Class<?>[] params = m.getParameterTypes(); // avoid clone
for (int j = 0; j < params.length; j++) {
sb.append(getTypeName(params[j]) + " a" + j);
if (j < (params.length - 1))
sb.append(',');
}
sb.append(')');
Class<?>[] exceptions = m.getExceptionTypes(); // avoid clone
if (exceptions.length > 0) {
sb.append(" throws ");
for (int k = 0; k < exceptions.length; k++) {
sb.append(exceptions[k].getName());
if (k < (exceptions.length - 1))
sb.append(',');
}
}
return sb.toString();
} catch (Exception e) {
return "<" + e + ">";
}
}
public static String getInnerString(Method m) {
try {
boolean isVoid = getTypeName(m.getReturnType()).equals("void");
StringBuilder sb = new StringBuilder();
if (isVoid == false)
sb.append("return ");
sb.append("this.inner.");
sb.append(m.getName()).append('(');
Class<?>[] params = m.getParameterTypes(); // avoid clone
for (int j = 0; j < params.length; j++) {
sb.append("a" + j);
if (j < (params.length - 1))
sb.append(", ");
}
sb.append(");");
return sb.toString();
} catch (Exception e) {
return "<" + e + ">";
}
}
static String getTypeName(Class<?> type) {
if (type.isArray()) {
try {
Class<?> cl = type;
int dimensions = 0;
while (cl.isArray()) {
dimensions++;
cl = cl.getComponentType();
}
StringBuffer sb = new StringBuffer();
sb.append(cl.getName());
for (int i = 0; i < dimensions; i++) {
sb.append("[]");
}
return sb.toString();
} catch (Throwable e) { /* FALLTHRU */
}
}
return type.getName();
}
}