KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > bridge > remote > generator > ClassToXML


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9  */

10
11 package org.mmbase.bridge.remote.generator;
12 import java.lang.reflect.*;
13 import org.w3c.dom.*;
14 import java.util.*;
15
16 /**
17  * Basic class to do reflection on a Class file and create
18  * an XML description of the class
19  * @author Kees Jongenburger <keesj@dds.nl>
20  **/

21 public class ClassToXML {
22
23     public static Element classToXML(String JavaDoc orgClassName, String JavaDoc original, Document document) throws Exception JavaDoc {
24         Element e = ClassToXML.classToXML(orgClassName, document);
25         e.setAttribute("originalname", original);
26         return e;
27     }
28
29     public static Element classToXML(String JavaDoc orgClassName, Document document) throws Exception JavaDoc {
30         Set appendedMethods = new HashSet();
31         Class JavaDoc clazz = Class.forName(orgClassName);
32
33         Element xmle = document.createElement(clazz.isInterface() ? "interface" : "class");
34
35         String JavaDoc 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 JavaDoc shortName = className.substring(shortIndex + 1);
43         // test op static member classes
44
xmle.setAttribute("shortname", shortName);
45
46         // Determin which classes must be serialized, rather then RMIed.
47

48         xmle.setAttribute("serializable",
49                           (java.io.Serializable JavaDoc.class.isAssignableFrom(clazz) &&
50                            ! org.mmbase.bridge.Cloud.class.equals(clazz)) // cloud is serializable for some reasons, but it cannot really well.
51
? "true" : "false");
52
53         Class JavaDoc[] interfaceClasses = clazz.getInterfaces();
54         String JavaDoc implementsString = "";
55         for (int counter = 0; counter < interfaceClasses.length; counter++) {
56             if (counter != 0) {
57                 implementsString += ",";
58             }
59             implementsString += interfaceClasses[counter].getName();
60         }
61         //System.out.println("" + clazz + " implements " + implementsString);
62
xmle.setAttribute("implements", implementsString);
63         Method[] methods = clazz.getMethods();
64         //add
65
Method[] extraMethods = new Method[3];
66         extraMethods[0] = String JavaDoc.class.getMethod("toString", new Class JavaDoc[] {});
67         extraMethods[1] = String JavaDoc.class.getMethod("hashCode", new Class JavaDoc[] {});
68         extraMethods[2] = String JavaDoc.class.getMethod("equals", new Class JavaDoc[] { Object JavaDoc.class });
69         for (int x = 0; x < extraMethods.length; x++) {
70             String JavaDoc 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                 //System.err.println("adding " + name + " to " + className);
83
}
84         }
85
86         //Method toString = xmle.getClass().getM
87
for (int i = 0; i < methods.length; i++) {
88             if (Modifier.isStatic(methods[i].getModifiers())) continue;
89             boolean createMethod = true;
90             //see if the declared method belongs to the same class
91
//we need to declare it
92
if (!methods[i].getDeclaringClass().getName().equals(orgClassName)) {
93                 createMethod = false;
94                 String JavaDoc methodName = methods[i].getName();
95
96                 if (methods[i].getDeclaringClass().isInterface()) {
97                     createMethod = true;
98                 }
99                 //add these methods that are part of Object
100
if (methodName.equals("equals") || methodName.equals("hashCode") || methodName.equals("toString")) {
101                     createMethod = true;
102                 }
103             }
104             if (createMethod) {
105                 //System.out.println("Creating method " + methods[i].getReturnType() + " " + methods[i].getName());
106
String JavaDoc 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 JavaDoc[] parameterClasses = methods[i].getParameterTypes();
114                 key += "(";
115                 for (int x = 0; x < parameterClasses.length; x++) {
116                     Class JavaDoc 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 JavaDoc 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 JavaDoc c, Document document) {
137         return classToXML(c, document, false);
138     }
139
140     public static Element classToXML(Class JavaDoc c, Document document, boolean isinarray) {
141         Element retval = null;
142         if (c.isArray()) {
143             // retval= document.createElement("array");
144
Class JavaDoc arr = c;
145             while (arr.isArray()) {
146                 arr = arr.getComponentType();
147             }
148             Element e = ClassToXML.classToXML(arr, document, true);
149             String JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc 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