1 10 11 package org.mmbase.bridge.remote.generator; 12 import java.lang.reflect.*; 13 import org.w3c.dom.*; 14 import java.util.*; 15 16 21 public class ClassToXML { 22 23 public static Element classToXML(String orgClassName, String original, Document document) throws Exception { 24 Element e = ClassToXML.classToXML(orgClassName, document); 25 e.setAttribute("originalname", original); 26 return e; 27 } 28 29 public static Element classToXML(String orgClassName, Document document) throws Exception { 30 Set appendedMethods = new HashSet(); 31 Class clazz = Class.forName(orgClassName); 32 33 Element xmle = document.createElement(clazz.isInterface() ? "interface" : "class"); 34 35 String className = orgClassName; 36 int shortIndex = className.lastIndexOf("."); 37 int dollarIndex = className.lastIndexOf("$"); 38 if (dollarIndex > -1) { 39 className = className.substring(0,dollarIndex) + "." + className.substring(dollarIndex + 1); 40 } 41 xmle.setAttribute("name", className); 42 String shortName = className.substring(shortIndex + 1); 43 xmle.setAttribute("shortname", shortName); 45 46 48 xmle.setAttribute("serializable", 49 (java.io.Serializable .class.isAssignableFrom(clazz) && 50 ! org.mmbase.bridge.Cloud.class.equals(clazz)) ? "true" : "false"); 52 53 Class [] interfaceClasses = clazz.getInterfaces(); 54 String implementsString = ""; 55 for (int counter = 0; counter < interfaceClasses.length; counter++) { 56 if (counter != 0) { 57 implementsString += ","; 58 } 59 implementsString += interfaceClasses[counter].getName(); 60 } 61 xmle.setAttribute("implements", implementsString); 63 Method[] methods = clazz.getMethods(); 64 Method[] extraMethods = new Method[3]; 66 extraMethods[0] = String .class.getMethod("toString", new Class [] {}); 67 extraMethods[1] = String .class.getMethod("hashCode", new Class [] {}); 68 extraMethods[2] = String .class.getMethod("equals", new Class [] { Object .class }); 69 for (int x = 0; x < extraMethods.length; x++) { 70 String name = extraMethods[x].getName(); 71 boolean add = true; 72 for (int y = 0; y < methods.length; y++) { 73 if (methods[y].getName().equals(extraMethods[x].getName())) { 74 add = false; 75 } 76 } 77 if (add) { 78 Method[] temp = new Method[methods.length + 1]; 79 System.arraycopy(methods, 0, temp, 0, methods.length); 80 temp[methods.length] = extraMethods[x]; 81 methods = temp; 82 } 84 } 85 86 for (int i = 0; i < methods.length; i++) { 88 if (Modifier.isStatic(methods[i].getModifiers())) continue; 89 boolean createMethod = true; 90 if (!methods[i].getDeclaringClass().getName().equals(orgClassName)) { 93 createMethod = false; 94 String methodName = methods[i].getName(); 95 96 if (methods[i].getDeclaringClass().isInterface()) { 97 createMethod = true; 98 } 99 if (methodName.equals("equals") || methodName.equals("hashCode") || methodName.equals("toString")) { 101 createMethod = true; 102 } 103 } 104 if (createMethod) { 105 String key = ""; 107 Element method = document.createElement("method"); 108 key += "method"; 109 method.setAttribute("name", methods[i].getName()); 110 key += methods[i].getName(); 111 112 Element parameters = document.createElement("input"); 113 Class [] parameterClasses = methods[i].getParameterTypes(); 114 key += "("; 115 for (int x = 0; x < parameterClasses.length; x++) { 116 Class parameterClass = parameterClasses[x]; 117 parameters.appendChild(ClassToXML.classToXML(parameterClass, document)); 118 key += parameterClass.getName(); 119 } 120 key += ")"; 121 method.appendChild(parameters); 122 123 Element returnValue = document.createElement("output"); 124 Class returnType = methods[i].getReturnType(); 125 returnValue.appendChild(ClassToXML.classToXML(returnType, document)); 126 method.appendChild(returnValue); 127 if (! appendedMethods.contains(key)) { 128 xmle.appendChild(method); 129 appendedMethods.add(key); 130 } 131 } 132 } 133 return xmle; 134 } 135 136 public static Element classToXML(Class c, Document document) { 137 return classToXML(c, document, false); 138 } 139 140 public static Element classToXML(Class c, Document document, boolean isinarray) { 141 Element retval = null; 142 if (c.isArray()) { 143 Class arr = c; 145 while (arr.isArray()) { 146 arr = arr.getComponentType(); 147 } 148 Element e = ClassToXML.classToXML(arr, document, true); 149 String className = arr.getName(); 150 int shortIndex = className.lastIndexOf("."); 151 e.setAttribute("shortname", className.substring(shortIndex + 1)); 152 return e; 153 } else if (c.isPrimitive()) { 154 if (isinarray) { 155 retval = document.createElement("array"); 156 } else { 157 retval = document.createElement("primitiveclass"); 158 } 159 retval.setAttribute("name", c.getName()); 160 retval.setAttribute("shortname", c.getName()); 161 String name = c.getName(); 162 if (name.equals("int")) { 163 retval.setAttribute("classname", "java.lang.Integer"); 164 } else if (name.equals("char")) { 165 retval.setAttribute("classname", "java.lang.Character"); 166 } else { 167 String first = name.substring(0, 1); 168 retval.setAttribute("classname", "java.lang." + first.toUpperCase() + name.substring(1)); 169 } 170 } else if (c.getName().startsWith("java.") || c.getName().startsWith("javax.") || c.getName().startsWith("org.w3")) { 171 if (isinarray) { 172 retval = document.createElement("array"); 173 } else { 174 retval = document.createElement("sunclass"); 175 } 176 retval.setAttribute("name", c.getName()); 177 } else { 178 if (isinarray) { 179 retval = document.createElement("array"); 180 } else { 181 retval = document.createElement("classReference"); 182 } 183 String className = c.getName(); 184 int dollarIndex = className.lastIndexOf("$"); 185 if (dollarIndex > -1) { 186 className = className.substring(0,dollarIndex) + "." + className.substring(dollarIndex + 1); 187 } 188 retval.setAttribute("name", className); 189 } 190 return retval; 191 } 192 } 193 | Popular Tags |