00001
00026 package org.objectweb.jonas_lib.deployment.tests;
00027
00028
00029 import java.io.Reader;
00030 import java.io.StringReader;
00031 import java.io.File;
00032 import java.io.FileReader;
00033 import java.lang.reflect.Method;
00034 import java.util.Hashtable;
00035 import java.util.StringTokenizer;
00036 import javax.xml.namespace.QName;
00037
00038
00039 import org.objectweb.jonas_lib.deployment.api.DeploymentDescException;
00040 import org.objectweb.jonas_lib.deployment.xml.AbsElement;
00041 import org.objectweb.jonas_lib.deployment.xml.Element;
00042 import org.objectweb.jonas_lib.deployment.xml.Qname;
00043
00048 public abstract class AbsDeploymentTest {
00049
00053 private Hashtable elementsCounter = null;
00054
00058 protected AbsDeploymentTest() {
00059 elementsCounter = new Hashtable();
00060 }
00061
00067 public void stress() throws Exception {
00068
00069 startTest(false);
00070
00071 for (int i = 0; i < 100; i++) {
00072 startTest(true);
00073 }
00074 }
00075
00076
00077
00078 public abstract AbsElement getTopLevelElement() throws Exception;
00079
00080 public abstract String parse(Reader reader, String name, boolean validation) throws Exception;
00081
00087 public void startTest(boolean random) throws Exception {
00088 AbsElement ae = getTopLevelElement();
00089 fill(ae, random);
00090 String xmlOriginal = ae.toXML();
00091 String xmlParsed = parse(new StringReader(xmlOriginal), "test", false);
00092 checkDiff(xmlOriginal, xmlParsed);
00093
00094 }
00095
00100 public void parseElement() throws Exception {
00101 AbsElement ae = getTopLevelElement();
00102 fill(ae, false);
00103 System.out.println("Parsing xml :");
00104 System.out.println(ae);
00105 String xmlOriginal = ae.toXML();
00106 String xmlParsed = parse(new StringReader(xmlOriginal), "test", false);
00107 System.out.println("Result = ");
00108 System.out.println(xmlParsed);
00109 }
00110
00115 public void parseXmlfromFile(String fileName) throws Exception {
00116 FileReader fileReader = null;
00117
00118
00119 if (!new File(fileName).exists()) {
00120 throw new DeploymentDescException("The file '" + fileName + "' was not found.");
00121 }
00122 fileReader = new FileReader(fileName);
00123 System.out.println("Parsing xml : " + fileName);
00124 String xmlParsed = parse(fileReader, fileName, true);
00125 System.out.println("Parsing OK Result = ");
00126 System.out.println(xmlParsed);
00127 }
00128
00136 protected void checkDiff(String xmlOriginal, String xmlParsed) throws Exception {
00137 StringTokenizer stOri = new StringTokenizer(xmlOriginal, "\n");
00138 StringTokenizer stPardsed = new StringTokenizer(xmlParsed, "\n");
00139
00140
00141 while (stOri.hasMoreTokens() && stPardsed.hasMoreTokens()) {
00142 String lineOri = stOri.nextToken();
00143 String lineparsed = stPardsed.nextToken();
00144 if (!lineOri.equals(lineparsed)) {
00145 System.err.println("Failure in xml :");
00146 System.err.println(xmlOriginal);
00147 throw new Exception("Line : " + lineOri + " is different than parsed value: " + lineparsed);
00148 }
00149 }
00150 }
00151
00159 public void fill(Element element, boolean random) throws Exception {
00160
00161
00162 Method[] methods = element.getClass().getMethods();
00163
00164
00165 for (int i = 0; i < methods.length; i++) {
00166
00167 Method method = methods[i];
00168 String name = method.getName();
00169 Class[] argsMethod = null;
00170 argsMethod = method.getParameterTypes();
00171
00172
00173 if ((argsMethod.length == 1) && (name.startsWith("set") || name.startsWith("add"))) {
00174 Class cl = argsMethod[0];
00175 if (cl.getName().equals("java.lang.String")) {
00176
00177 fillString(element, method, random);
00178 } else if (cl.getName().equals("javax.xml.namespace.QName")) {
00179 fillQName(element, method, random);
00180 } else {
00181
00182 if (name.startsWith("set")) {
00183 setElement(element, method, argsMethod, random);
00184 } else {
00185 addElement(element, method, argsMethod, random);
00186 }
00187 }
00188 }
00189
00190 }
00191
00192 }
00193
00198 protected boolean aleatOK() {
00199 return (Math.random() > 0.5);
00200 }
00201
00206 protected int nbAleat() {
00207 return (int) (Math.random() * 5);
00208 }
00209
00219 protected void addElement(Element element, Method method, Class[] argsMethod, boolean random) throws Exception {
00220 int nb = 1;
00221 if (random) {
00222 nb = nbAleat();
00223 }
00224 for (int i = 0; i < nb; i++) {
00225 setElement(element, method, argsMethod, random);
00226 }
00227 }
00228
00238 protected void setElement(Element element, Method method, Class[] argsMethod, boolean random) throws Exception {
00239 if (random && !aleatOK()) {
00240 return;
00241 }
00242
00243 String name = method.getName();
00244
00245 Class cl = argsMethod[0];
00246 String className = cl.getName();
00247
00248
00249 if (Element.class.isAssignableFrom(cl)) {
00250
00251 Object subElement = cl.newInstance();
00252
00253
00254 method.invoke(element, new Object[] {subElement});
00255
00256
00257 fill((Element) subElement, random);
00258
00259
00260 if (cl.isAssignableFrom(Qname.class)) {
00261
00262 String qNameElement = convertUpperCaseToXml(name.substring(3, name.length()));
00263 ((Qname) subElement).setName(qNameElement);
00264 }
00265
00266 }
00267 }
00268
00276 protected void fillString(Element element, Method method, boolean random) throws Exception {
00277 if (random && !aleatOK()) {
00278 return;
00279 }
00280 method.invoke(element, (Object[]) new String[] {getNameCounterForElement(element, method)});
00281 }
00282
00290 protected void fillQName(Element element, Method method, boolean random) throws Exception {
00291 if (random && !aleatOK()) {
00292 return;
00293 }
00294 QName qName = new QName("prefix:Test", getNameCounterForElement(element, method));
00295 method.invoke(element, (Object[]) new QName[] {qName});
00296 }
00297
00306 protected String getNameCounterForElement(Element element, Method method) {
00307 StringBuffer sb = new StringBuffer();
00308
00309
00310 String name = method.getName().substring(3, method.getName().length());
00311 String packageClassname = element.getClass().getPackage().getName();
00312 String fullClass = packageClassname + "." + name;
00313
00314
00315 Integer counter = (Integer) elementsCounter.get(fullClass);
00316 if (counter == null) {
00317
00318 counter = new Integer(0);
00319 } else {
00320
00321 counter = new Integer(counter.intValue() + 1);
00322 }
00323 elementsCounter.put(fullClass, counter);
00324
00325
00326 return name + counter.intValue();
00327 }
00328
00335 protected String convertUpperCaseToXml(String name) {
00336 StringBuffer sb = new StringBuffer();
00337 sb.append(Character.toLowerCase(name.charAt(0)));
00338
00339 for (int i = 1; i < name.length(); i++) {
00340 if (Character.isUpperCase(name.charAt(i))) {
00341 sb.append("-");
00342 }
00343 sb.append(Character.toLowerCase(name.charAt(i)));
00344
00345 }
00346 return sb.toString();
00347
00348 }
00349
00350 }