AbsDeploymentTest.java

00001 
00026 package org.objectweb.jonas_lib.deployment.tests;
00027 
00028 // java
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 // jonas
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     // Abstract Methods used by startTest implemented in subclasses
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         // Check if the file exists.
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         // Compare line by line
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         // Get setters of the element
00162         Method[] methods = element.getClass().getMethods();
00163 
00164         // Analyze if it is Set or Add Method
00165         for (int i = 0; i < methods.length; i++) {
00166             // Get name
00167             Method method = methods[i];
00168             String name = method.getName();
00169             Class[] argsMethod = null;
00170             argsMethod = method.getParameterTypes();
00171 
00172             // One argument method
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                     // Test if it's one argument with String type :
00177                     fillString(element, method, random);
00178                 } else if (cl.getName().equals("javax.xml.namespace.QName")) {
00179                     fillQName(element, method, random);
00180                 } else {
00181                     // It's a subelement
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         // Element object ?
00249         if (Element.class.isAssignableFrom(cl)) {
00250             // Create required object
00251             Object subElement = cl.newInstance();
00252 
00253             // Add object on top level object
00254             method.invoke(element, new Object[] {subElement});
00255 
00256             // Fill values of this element
00257             fill((Element) subElement, random);
00258 
00259             // Qname is a particular type, need to set the name
00260             if (cl.isAssignableFrom(Qname.class)) {
00261                 // Transform name into Qname
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         // Extract package.classname
00310         String name = method.getName().substring(3, method.getName().length());
00311         String packageClassname = element.getClass().getPackage().getName();
00312         String fullClass = packageClassname + "." + name;
00313 
00314         // Existing counter ?
00315         Integer counter = (Integer) elementsCounter.get(fullClass);
00316         if (counter == null) {
00317             // init counter as it don't already exist
00318             counter = new Integer(0);
00319         } else {
00320             // Increment
00321             counter = new Integer(counter.intValue() + 1);
00322         }
00323         elementsCounter.put(fullClass, counter);
00324 
00325         // return value
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 }

Generated on Tue Feb 15 15:05:50 2005 for JOnAS by  doxygen 1.3.9.1