[Red5commits] [red5 commit] r3139 - java/server/trunk java/server/trunk/src/org/red5/io/amf java/server/trunk/src/org/red5/io...

codesite-noreply at google.com codesite-noreply at google.com
Thu Oct 2 13:46:51 PDT 2008


Author: mondain
Date: Thu Oct  2 13:45:49 2008
New Revision: 3139

Added:
    java/server/trunk/src/org/red5/io/utils/Stax2DomBuilder.java
    java/server/trunk/test/org/red5/io/
    java/server/trunk/test/org/red5/io/utils/
    java/server/trunk/test/org/red5/io/utils/XMLUtilsTest.java
    repository/stax2-2.1.jar   (contents, props changed)
    repository/stax2-3.0pr1.jar   (contents, props changed)
    repository/wstx-lgpl-3.2.7.jar   (contents, props changed)
    repository/wstx-lgpl-3.9.2.jar   (contents, props changed)
Modified:
    java/server/trunk/ivy.xml
    java/server/trunk/src/org/red5/io/amf/Input.java
    java/server/trunk/src/org/red5/io/amf/Output.java
    java/server/trunk/src/org/red5/io/object/Serializer.java
    java/server/trunk/src/org/red5/io/utils/XMLUtils.java
    java/server/trunk/src/org/red5/server/service/ConversionUtils.java
    java/server/trunk/src/org/red5/server/service/ServiceUtils.java

Log:
Verified performance of xml util in relation to echo - xml test. Optmized  
reflection in conversion util to skip listing all methods of a class.  
Removed unneeded NPE check in Serializer.

Modified: java/server/trunk/ivy.xml
==============================================================================
--- java/server/trunk/ivy.xml	(original)
+++ java/server/trunk/ivy.xml	Thu Oct  2 13:45:49 2008
@@ -59,10 +59,15 @@
          <dependency name="quartz" rev="1.6.1-RC1" />
          <dependency org="javax" name="jta" rev="1.0.1B" />
          <dependency name="ehcache" rev="1.4.1" />
+        <dependency org="javax" name="activation" rev="1.1" />
+        <!-- XML -->
          <dependency name="xercesImpl" rev="2.9.0" />
          <dependency name="xml-apis" rev="2.9.0" />
          <dependency name="xmlrpc" rev="2.0.1" />
-        <dependency org="javax" name="activation" rev="1.1" />
+        <!--
+        <dependency name="stax2" rev="3.0pr1" />
+        <dependency name="wstx-lgpl" rev="3.9.2" />
+         -->
          <!-- JMX -->
          <dependency org="jmx" name="jmxremote" rev="1.0.1" />
          <dependency org="jmx" name="jmxtools" rev="1.2.1" />

Modified: java/server/trunk/src/org/red5/io/amf/Input.java
==============================================================================
--- java/server/trunk/src/org/red5/io/amf/Input.java	(original)
+++ java/server/trunk/src/org/red5/io/amf/Input.java	Thu Oct  2 13:45:49  
2008
@@ -514,7 +514,6 @@
  		// skip two marker bytes
  		// then end of object byte
  		buf.skip(3);
-		// byte nextType = buf.get();
  	}

  	// Others

Modified: java/server/trunk/src/org/red5/io/amf/Output.java
==============================================================================
--- java/server/trunk/src/org/red5/io/amf/Output.java	(original)
+++ java/server/trunk/src/org/red5/io/amf/Output.java	Thu Oct  2 13:45:49  
2008
@@ -245,9 +245,7 @@

  	/** {@inheritDoc} */
      public void writeReference(Object obj) {
-		if (log.isDebugEnabled()) {
-			log.debug("Write reference");
-		}
+		log.debug("Write reference");
  		buf.put(AMF.TYPE_REFERENCE);
  		buf.putShort(getReferenceId(obj));
  	}
@@ -312,7 +310,7 @@
                  return clazz.getDeclaredField(keyName);
              } catch (NoSuchFieldException nfe) {
                  // Ignore this exception and use the default behavior
-                log.debug("writeObject caught NoSuchFieldException");
+                log.debug("writeObject caught NoSuchFieldException", nfe);
              }
          }
          return null;

Modified: java/server/trunk/src/org/red5/io/object/Serializer.java
==============================================================================
--- java/server/trunk/src/org/red5/io/object/Serializer.java	(original)
+++ java/server/trunk/src/org/red5/io/object/Serializer.java	Thu Oct  2  
13:45:49 2008
@@ -315,24 +315,18 @@
       */
      public boolean serializeField(Field field) {
      	log.debug("Serialize field: {}", field);
-    	//TODO: what to do when field is null
-    	//default to serialize
-        boolean dontSerialize = false;
-        try {
-        	//this throws an NPE so we need to catch it
-        	dontSerialize = field.isAnnotationPresent(DontSerialize.class);
-        } catch (NullPointerException npe) {
-        	
-        }
-        boolean isTransient = Modifier.isTransient(field.getModifiers());
-        boolean isClass = "class".equals(field.getName());
-
-        if (dontSerialize && log.isDebugEnabled()) {
+    	//null fields must be prevented from reaching this method
+        boolean dontSerialize =  
field.isAnnotationPresent(DontSerialize.class);
+        if (dontSerialize) {
              log.debug("Skipping {} because its marked with  
@DontSerialize", field.getName());
          }
+
+        boolean isTransient = Modifier.isTransient(field.getModifiers());
          if (isTransient) {
              log.warn("Using \"transient\" to declare fields not to be  
serialized is deprecated and will be removed in Red5 0.8, use  
\"@DontSerialize\" instead.");
          }
+
+        boolean isClass = "class".equals(field.getName());

          return !(dontSerialize || isTransient || isClass);
      }

Added: java/server/trunk/src/org/red5/io/utils/Stax2DomBuilder.java
==============================================================================
--- (empty file)
+++ java/server/trunk/src/org/red5/io/utils/Stax2DomBuilder.java	Thu Oct  2  
13:45:49 2008
@@ -0,0 +1,345 @@
+/*--
+
+ Copyright (C) 2005 Tatu Saloranta
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions, and the disclaimer that follows
+    these conditions in the documentation and/or other materials
+    provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED.  IN NO EVENT SHALL THE JDOM AUTHORS OR THE PROJECT
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ */
+
+package org.red5.io.utils;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Builds a DOM {@link org.w3c.dom.Document} using a
+ * {@link javax.xml.stream.XMLStreamReader}.
+ *
+ * @version $Revision: 1.00 $, $Date: 2004/12/11 00:00:00 $
+ * @author Tatu Saloranta
+ */
+public class Stax2DomBuilder {
+	// // // Configuration settings:
+
+	/**
+	 * Whether ignorable white space should be ignored, ie not added in the
+	 * resulting JDOM tree. If true, it will be ignored; if false, it will be
+	 * added in the tree. Default value if false.
+	 */
+	protected boolean mCfgIgnoreWs = false;
+
+	protected boolean mNsAware = true;
+
+	// // Trivial caching...
+
+	protected String mLastPrefix = null;
+
+	protected String mLastLocalName = null;
+
+	protected String mLastQName = null;
+
+	/**
+	 * Default constructor.
+	 */
+	public Stax2DomBuilder() {
+
+	}
+
+	/**
+	 * Method used to change whether the build methods will add ignorable
+	 * (element) white space in the DOM tree or not.
+	 *<p>
+	 * Whether all-whitespace text segment is ignorable white space or not is
+	 * based on DTD read in, as per XML specifications (white space is only
+	 * significant in mixed content or pure text elements).
+	 */
+	public void setIgnoreWhitespace(boolean state) {
+		mCfgIgnoreWs = state;
+	}
+
+	/**
+	 * This method will create a {@link org.w3c.dom.Document} instance using  
the
+	 * default JAXP mechanism and populate using the given StAX stream reader.
+	 *
+	 * @param r
+	 *            Stream reader from which input is read.
+	 * @return <code>Document</code> - DOM document object.
+	 * @throws XMLStreamException
+	 *             If the reader threw such exception (to indicate a parsing  
or
+	 *             I/O problem)
+	 */
+	public Document build(XMLStreamReader r)
+			throws ParserConfigurationException, XMLStreamException {
+		return build(r, DocumentBuilderFactory.newInstance()
+				.newDocumentBuilder());
+	}
+
+	public Document build(XMLStreamReader r, DocumentBuilder docbuilder)
+			throws XMLStreamException {
+		Document doc = docbuilder.newDocument();
+		build(r, doc);
+		return doc;
+	}
+
+	/**
+	 * This method will populate given {@link org.w3c.dom.Document} using the
+	 * given StAX stream reader instance.
+	 *
+	 * @param r
+	 *            Stream reader from which input is read.
+	 * @return <code>Document</code> - DOM document object.
+	 * @throws XMLStreamException
+	 *             If the reader threw such exception (to indicate a parsing  
or
+	 *             I/O problem)
+	 */
+	public void build(XMLStreamReader r, Document doc)
+			throws XMLStreamException {
+		buildTree(r, doc);
+	}
+
+	/**
+	 * This method takes a <code>XMLStreamReader</code> and builds up a JDOM
+	 * tree. Recursion has been eliminated by using nodes' parent/child
+	 * relationship; this improves performance somewhat (classic
+	 * recursion-by-iteration-and-explicit stack transformation)
+	 *
+	 * @param f
+	 *            Node factory to use for creating JDOM nodes
+	 * @param r
+	 *            Stream reader to use for reading the document from which to
+	 *            build the tree
+	 * @param doc
+	 *            JDOM <code>Document</code> being built.
+	 * @param tmod
+	 *            Text modifier to use for modifying content of text nodes
+	 *            (CHARACTERS, not CDATA), if any; null if no modifications  
are
+	 *            needed (modifier is usually used for trimming unnecessary  
but
+	 *            non-ignorable white space).
+	 */
+	protected void buildTree(XMLStreamReader r, Document doc)
+			throws XMLStreamException {
+		checkReaderSettings(r);
+
+		Node current = doc; // At top level
+
+		main_loop:
+
+		while (true) {
+			int evtType = r.next();
+			Node child;
+
+			switch (evtType) {
+				case XMLStreamConstants.CDATA:
+					child = doc.createCDATASection(r.getText());
+					break;
+
+				case XMLStreamConstants.SPACE:
+					if (mCfgIgnoreWs) {
+						continue main_loop;
+					}
+					/*
+					 * Oh great. DOM is brain-dead in that ignorable white space
+					 * can not be added, even though it is legal, and often
+					 * reported by StAX/SAX impls...
+					 */
+					if (current == doc) { // better just ignore, thus...
+						continue;
+					}
+					// fall through
+
+				case XMLStreamConstants.CHARACTERS:
+					child = doc.createTextNode(r.getText());
+					break;
+
+				case XMLStreamConstants.COMMENT:
+					child = doc.createComment(r.getText());
+					break;
+
+				case XMLStreamConstants.END_DOCUMENT:
+					break main_loop;
+
+				case XMLStreamConstants.END_ELEMENT:
+					current = current.getParentNode();
+					if (current == null) {
+						current = doc;
+					}
+					continue main_loop;
+
+				case XMLStreamConstants.ENTITY_DECLARATION:
+				case XMLStreamConstants.NOTATION_DECLARATION:
+					/*
+					 * Shouldn't really get these, but maybe some stream readers
+					 * do provide the info. If so, better ignore it -- DTD event
+					 * should have most/all we need.
+					 */
+					continue main_loop;
+
+				case XMLStreamConstants.ENTITY_REFERENCE:
+					child = doc.createEntityReference(r.getLocalName());
+					break;
+
+				case XMLStreamConstants.PROCESSING_INSTRUCTION:
+					child = doc.createProcessingInstruction(r.getPITarget(), r
+							.getPIData());
+					break;
+
+				case XMLStreamConstants.START_ELEMENT:
+					// Ok, need to add a new element...
+				{
+					String ln = r.getLocalName();
+					Element newElem;
+
+					if (mNsAware) {
+						String elemPrefix = r.getPrefix();
+
+						// Doh, DOM requires a silly qualified name...
+						if (elemPrefix != null && elemPrefix.length() > 0) {
+							newElem = doc.createElementNS(r.getNamespaceURI(),
+									getQualified(elemPrefix, ln));
+						} else {
+							newElem = doc.createElementNS(r.getNamespaceURI(),
+									ln);
+						}
+					} else { // if non-ns-aware, things are simpler:
+						newElem = doc.createElement(ln);
+					}
+
+					/*
+					 * No need to check namespace bindings, unlikes with some
+					 * other frameworks (JDOM)
+					 */
+
+					// And then the attributes:
+					for (int i = 0, len = r.getAttributeCount(); i < len; ++i) {
+						ln = r.getAttributeLocalName(i);
+						if (mNsAware) {
+							String prefix = r.getAttributePrefix(i);
+							if (prefix != null && prefix.length() > 0) {
+								ln = getQualified(prefix, ln);
+							}
+							Attr attr = doc.createAttributeNS(r
+									.getAttributeNamespace(i), ln);
+							attr.setValue(r.getAttributeValue(i));
+							newElem.setAttributeNodeNS(attr);
+						} else {
+							Attr attr = doc.createAttribute(ln);
+							attr.setValue(r.getAttributeValue(i));
+							newElem.setAttributeNode(attr);
+						}
+					}
+					// And then 'push' new element...
+					current.appendChild(newElem);
+					current = newElem;
+					continue main_loop;
+				}
+
+				case XMLStreamConstants.START_DOCUMENT:
+					/*
+					 * This should only be received at the beginning of
+					 * document... so, should we indicate the problem or not?
+					 */
+					/*
+					 * For now, let it pass: maybe some (broken) readers pass
+					 * that info as first event in beginning of doc?
+					 */
+					continue main_loop;
+
+				case XMLStreamConstants.DTD:
+					/*
+					 * !!! Note: StAX does not expose enough information about
+					 * doctype declaration (specifically, public and system
+					 * id!); (altough StAX2 would...)
+					 *
+					 * Worse, DOM1/2 do not specify a way to create the DocType
+					 * node, even if StAX provided it. This is pretty silly, all
+					 * in all.
+					 */
+					continue main_loop;
+
+					// Should never get these, from a stream reader:
+
+					/*
+					 * (commented out entries are just FYI; default catches them
+					 * all)
+					 */
+
+					// case XMLStreamConstants.ATTRIBUTE:
+					// case XMLStreamConstants.NAMESPACE:
+				default:
+					throw new XMLStreamException(
+							"Unrecognized iterator event type: "
+									+ r.getEventType()
+									+ "; should not receive such types (broken stream reader?)");
+			}
+
+			if (child != null) {
+				current.appendChild(child);
+			}
+		}
+	}
+
+	// // // Overridable helper methods:
+
+	protected String getQualified(String prefix, String localName) {
+		/*
+		 * This mostly/only helps with empty/text-only elements... might make
+		 * sense to do 'real' caching...
+		 */
+		if (localName == mLastLocalName && prefix == mLastPrefix) {
+			return mLastQName;
+		}
+		String qn = prefix + ":" + localName;
+		mLastQName = qn;
+		return qn;
+	}
+
+	protected void checkReaderSettings(XMLStreamReader r)
+			throws XMLStreamException {
+		Object o = r.getProperty(XMLInputFactory.IS_NAMESPACE_AWARE);
+		/*
+		 * StAX defaults to namespace aware, so let's use similar logics
+		 * (although all compliant implementations really should return a valid
+		 * value)
+		 */
+		if ((o instanceof Boolean) && !((Boolean) o).booleanValue()) {
+			mNsAware = false;
+		} else {
+			mNsAware = true;
+		}
+	}
+
+}

Modified: java/server/trunk/src/org/red5/io/utils/XMLUtils.java
==============================================================================
--- java/server/trunk/src/org/red5/io/utils/XMLUtils.java	(original)
+++ java/server/trunk/src/org/red5/io/utils/XMLUtils.java	Thu Oct  2  
13:45:49 2008
@@ -20,6 +20,7 @@
   */

  import java.io.IOException;
+import java.io.Reader;
  import java.io.StringReader;
  import java.io.StringWriter;

@@ -32,23 +33,26 @@
  import javax.xml.transform.dom.DOMSource;
  import javax.xml.transform.stream.StreamResult;

+import org.apache.commons.lang.StringUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.w3c.dom.Document;
  import org.xml.sax.InputSource;

+
  /**
- *Misc XML utils
+ * Misc XML utils
   *
   * @author The Red5 Project (red5 at osflash.org)
   * @author Luke Hubbard, Codegent Ltd (luke at codegent.com)
+ * @author Paul Gregoire (mondain at gmail.com)
   */
  public class XMLUtils {
      /**
       * Logger
       */
  	protected static Logger log = LoggerFactory.getLogger(XMLUtils.class);
-
+	
      /**
       * Converts string representation of XML into Document
       * @param str              String representation of XML
@@ -56,14 +60,24 @@
       * @throws IOException     I/O exception
       */
      public static Document stringToDoc(String str) throws IOException {
-		try {
-			DocumentBuilder db = DocumentBuilderFactory.newInstance()
-					.newDocumentBuilder();
-			return db.parse(new InputSource(new StringReader(str)));
-		} catch (Exception ex) {
-			throw new IOException("Error converting from string to doc "
-					+ ex.getMessage());
-		}
+    	if (StringUtils.isNotEmpty(str)) {
+    		try {    			
+    			Reader reader = new StringReader(str);
+    			
+    			DocumentBuilder db = DocumentBuilderFactory.newInstance()
+    					.newDocumentBuilder();
+    			Document doc = db.parse(new InputSource(reader));
+    			    			
+    			reader.close();
+    	
+    			return doc;
+    		} catch (Exception ex) {
+    			log.debug("String: {}", str);
+    			throw new IOException(String.format("Error converting from string  
to doc %s", ex.getMessage()));
+    		}
+    	} else {
+    		throw new IOException("Error - could not convert empty string to  
doc");
+    	}
  	}

      /**
@@ -102,8 +116,7 @@
  			trans.transform(new DOMSource(domDoc), result);
  			return sw.toString();
  		} catch (Exception ex) {
-			throw new IOException("Error converting from doc to string "
-					+ ex.getMessage());
+			throw new IOException(String.format("Error converting from doc to  
string %s", ex.getMessage()));
  		}
  	}


Modified: java/server/trunk/src/org/red5/server/service/ConversionUtils.java
==============================================================================
--- java/server/trunk/src/org/red5/server/service/ConversionUtils.java	 
(original)
+++ java/server/trunk/src/org/red5/server/service/ConversionUtils.java	Thu  
Oct  2 13:45:49 2008
@@ -34,7 +34,6 @@
  import org.apache.commons.beanutils.BeanMap;
  import org.apache.commons.beanutils.BeanUtils;
  import org.apache.commons.beanutils.ConversionException;
-import org.red5.io.object.Deserializer;
  import org.red5.server.api.IConnection;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
@@ -47,7 +46,7 @@
   */
  public class ConversionUtils {

-	private static final Logger log =  
LoggerFactory.getLogger(Deserializer.class);
+	private static final Logger log =  
LoggerFactory.getLogger(ConversionUtils.class);

  	private static final Class<?>[] PRIMITIVES = { boolean.class, byte.class,
  			char.class, short.class, int.class, long.class, float.class,
@@ -98,12 +97,11 @@
      public static Object convert(Object source, Class<?> target)
  			throws ConversionException {
  		if (target == null) {
-			throw new ConversionException("Unable to perform conversion");
+			throw new ConversionException("Unable to perform conversion, target was  
null");
  		}
  		if (source == null) {
  			if (target.isPrimitive()) {
-				throw new ConversionException(
-						"Unable to convert null to primitive value");
+				throw new ConversionException(String.format("Unable to convert null to  
primitive value of %s", target));
  			}
  			return source;
  		} else if ((source instanceof Float && ((Float) source).isNaN()) ||
@@ -114,7 +112,7 @@
  		
  		if (IConnection.class.isAssignableFrom(source.getClass())
  				&& !target.equals(IConnection.class)) {
-			throw new ConversionException("IConnection must match exact.");
+			throw new ConversionException("IConnection must match exactly");
  		}
  		if (target.isInstance(source)) {
  			return source;
@@ -147,7 +145,7 @@
  		if (target.equals(Set.class) && source.getClass().isArray()) {
  			return convertArrayToSet((Object[]) source);
  		}
-		throw new ConversionException("Unable to preform conversion");
+		throw new ConversionException(String.format("Unable to preform  
conversion from %s to %s", source, target));
  	}

      /**
@@ -234,7 +232,7 @@
  		} else if (wrapper.equals(Byte.class)) {
  			return new Byte(str);
  		}
-		throw new ConversionException("Unable to convert string to: " + wrapper);
+		throw new ConversionException(String.format("Unable to convert string  
to: %s", wrapper));
  	}

      /**
@@ -262,7 +260,7 @@
  		} else if (wrapper.equals(Byte.class)) {
  			return Byte.valueOf(num.byteValue());
  		}
-		throw new ConversionException("Unable to convert number to: " + wrapper);
+		throw new ConversionException(String.format("Unable to convert number  
to: %s", wrapper));
  	}

      /**
@@ -307,6 +305,19 @@
  		return converted;
  	}

+    /**
+     * Convert parameters using methods of this utility class
+     * @param source                Array of source object
+     * @return                      Array of converted objects
+     */
+    public static Class<?>[] convertParams(Object[] source) {
+    	Class<?>[] converted = new Class<?>[source.length];
+		for (int i = 0; i < source.length; i++) {
+			converted[i] = source[i].getClass();
+		}
+		return converted;
+	}
+
      /**
       *
       * @param source

Modified: java/server/trunk/src/org/red5/server/service/ServiceUtils.java
==============================================================================
--- java/server/trunk/src/org/red5/server/service/ServiceUtils.java	 
(original)
+++ java/server/trunk/src/org/red5/server/service/ServiceUtils.java	Thu  
Oct  2 13:45:49 2008
@@ -41,7 +41,7 @@
       * @return                 Method/params pairs
       */
  	public static Object[] findMethodWithExactParameters(Object service,
-			String methodName, List args) {
+			String methodName, List<?> args) {
  		Object[] arguments = new Object[args.size()];
  		for (int i = 0; i < args.size(); i++) {
  			arguments[i] = args.get(i);
@@ -63,8 +63,20 @@
  	public static Object[] findMethodWithExactParameters(Object service,
  			String methodName, Object[] args) {
  		int numParams = (args == null) ? 0 : args.length;
-		List methods = ConversionUtils.findMethodsByNameAndNumParams(service,
-				methodName, numParams);
+		
+		Method method = null;
+
+		try {
+    		//try to skip the listing of all the methods by checking for exactly  
what
+    		//we want first
+    		method = service.getClass().getMethod(methodName,  
ConversionUtils.convertParams(args));
+    		log.debug("Exact method found (skipping list): {}", methodName);
+    		return new Object[]{ method, args };
+		} catch (Exception e) {
+			log.debug("Method not found using exact parameter types");
+		}
+		
+		List<Method> methods =  
ConversionUtils.findMethodsByNameAndNumParams(service, methodName,  
numParams);
  		log.debug("Found {} methods", methods.size());
  		if (methods.isEmpty()) {
  			return new Object[] { null, null };
@@ -74,7 +86,6 @@
  			log.debug("Parameter conversion will be attempted in order.");
  		}

-		Method method = null;
  		Object[] params = null;

  		// First search for method with exact parameters
@@ -118,7 +129,7 @@
  	}

  	/**
-	 * Returns (method, params) for the given service or (null, null) if not
+	 * Returns (method, params) for the given service or (null, null) if no
  	 * method was found.
  	 *
       * @param service           Service
@@ -127,7 +138,7 @@
       * @return                  Method/params pairs
       */
  	public static Object[] findMethodWithListParameters(Object service,
-			String methodName, List args) {
+			String methodName, List<?> args) {
  		Object[] arguments = new Object[args.size()];
  		for (int i = 0; i < args.size(); i++) {
  			arguments[i] = args.get(i);
@@ -147,8 +158,20 @@
       */
  	public static Object[] findMethodWithListParameters(Object service,
  			String methodName, Object[] args) {
-		List methods = ConversionUtils.findMethodsByNameAndNumParams(service,
-				methodName, 1);
+		
+		Method method = null;
+
+		try {
+    		//try to skip the listing of all the methods by checking for exactly  
what
+    		//we want first
+    		method = service.getClass().getMethod(methodName,  
ConversionUtils.convertParams(args));
+    		log.debug("Exact method found (skipping list): {}", methodName);
+    		return new Object[]{ method, args };
+		} catch (Exception e) {
+			log.debug("Method not found using exact parameter types");
+		}
+		
+		List<Method> methods =  
ConversionUtils.findMethodsByNameAndNumParams(service, methodName, 1);
  		log.debug("Found {} methods", methods.size());
  		if (methods.isEmpty()) {
  			return new Object[] { null, null };
@@ -165,7 +188,6 @@
  		}
  		args = new Object[] { argsList };

-		Method method = null;
  		Object[] params = null;
  		for (int i = 0; i < methods.size(); i++) {
  			try {

Added: java/server/trunk/test/org/red5/io/utils/XMLUtilsTest.java
==============================================================================
--- (empty file)
+++ java/server/trunk/test/org/red5/io/utils/XMLUtilsTest.java	Thu Oct  2  
13:45:49 2008
@@ -0,0 +1,36 @@
+package org.red5.io.utils;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+public class XMLUtilsTest {
+	
+	private static final String XML_STRING = "<?xml version=\"1.0\"  
encoding=\"UTF-8\"?><red5 version=\"0.8.0\"><note>Red5 is  
awesome</note><emptynode/></red5>";
+	private static final String XML_STRING_HUGE = "<?xml version=\"1.0\"  
encoding=\"UTF-8\"?><ivy-module version=\"1.3\"  
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"  
xsi:noNamespaceSchemaLocation=\"http://ant.apache.org/ivy/schemas/ivy.xsd\">  
<info organisation=\"red5\" module=\"server\" /> <configurations>  <conf  
name=\"default\"/> <conf name=\"java5\" extends=\"default\"  
description=\"Java 5 dependencies\"/> <conf name=\"java6\"  
extends=\"default\" description=\"Java 6 dependencies\"/> <conf  
name=\"utest\" extends=\"eclipse\" description=\"Unit testing  
dependencies\"/> <conf name=\"eclipse\" description=\"Special dependencies  
in Eclipse\"/> </configurations> <dependencies> <!-- J2EE --> <dependency  
org=\"tomcat\" name=\"jasper\" rev=\"6.0.18\" /> <dependency org=\"tomcat\"  
name=\"jasper-jdt\" rev=\"6.0.18\" /> <!-- <dependency org=\"tomcat\"  
name=\"jasper-el\" rev=\"6.0.18\" /> <dependency org=\"tomcat\"  
name=\"el-api\" rev=\"\" /> --> <dependency org=\"javax\" name=\"jsp-api\"  
rev=\"2.1\" /> <dependency org=\"javax\" name=\"servlet-api\" rev=\"2.5\"  
/> <dependency org=\"javax\" name=\"ejb3-persistence\" rev=\"\" />  
<dependency name=\"naming-factory\" rev=\"\" /> <dependency  
name=\"naming-resources\" rev=\"\" /> <!-- Spring --> <dependency  
org=\"spring\" name=\"spring-aop\" rev=\"2.5.5\" /> <dependency  
org=\"spring\" name=\"spring-orm\" rev=\"2.5.5\" /> <dependency  
org=\"spring\" name=\"spring-beans\" rev=\"2.5.5\" /> <dependency  
org=\"spring\" name=\"spring-context\" rev=\"2.5.5\" /> <dependency  
org=\"spring\" name=\"spring-core\" rev=\"2.5.5\" /> <dependency  
org=\"spring\" name=\"spring-web\" rev=\"2.5.5\" /> <dependency  
org=\"spring\" name=\"aopalliance\" rev=\"\" /> <!-- Tomcat --> <dependency  
org=\"tomcat\" name=\"catalina\" rev=\"6.0.18\" /> <dependency  
org=\"tomcat\" name=\"tomcat-coyote\" rev=\"6.0.18\" /> <dependency  
org=\"tomcat\" name=\"annotations-api\" rev=\"\" /> <dependency  
org=\"commons\" name=\"commons-modeler\" rev=\"2.0.1\" /> <!-- Jetty -->  
<dependency org=\"jetty\" name=\"jetty\" rev=\"6.1.9\" /> <dependency  
org=\"jetty\" name=\"jetty-util\" rev=\"6.1.9\" /> <dependency  
org=\"jetty\" name=\"jetty-xbean\" rev=\"6.1.9\" /> <!-- Logging -->  
<dependency name=\"slf4j-api\" rev=\"1.5.3\" /> <dependency  
name=\"jcl-over-slf4j\" rev=\"1.5.3\" /> <dependency  
name=\"log4j-over-slf4j\" rev=\"1.5.3\" /> <dependency  
name=\"jul-to-slf4j\" rev=\"1.5.3\" /> <dependency  
name=\"tomcat-juli-slf4j\" rev=\"1.5.0\" /> <dependency  
name=\"logback-core\" rev=\"0.9.10-SNAPSHOT\" /> <dependency  
name=\"logback-classic\" rev=\"0.9.10-SNAPSHOT\" /> <!-- General -->  
<dependency org=\"cglib\" name=\"cglib-nodep\" rev=\"2.1_3\" /> <dependency  
org=\"commons\" name=\"commons-beanutils\" rev=\"1.8.0\" /> <dependency  
org=\"commons\" name=\"commons-codec\" rev=\"1.3\" /> <dependency  
org=\"commons\" name=\"commons-collections\" rev=\"3.2.1\" /> <dependency  
org=\"commons\" name=\"commons-httpclient\" rev=\"3.1\" /> <dependency  
org=\"commons\" name=\"commons-lang\" rev=\"2.4\" /> <dependency  
org=\"commons\" name=\"commons-pool\" rev=\"1.3\" /> <dependency  
name=\"quartz\" rev=\"1.6.1-RC1\" /> <dependency org=\"javax\" name=\"jta\"  
rev=\"1.0.1B\" /> <dependency name=\"ehcache\" rev=\"1.4.1\" /> <dependency  
org=\"javax\" name=\"activation\" rev=\"1.1\" /> <!-- XML --> <dependency  
name=\"xercesImpl\" rev=\"2.9.0\" /> <dependency name=\"xml-apis\"  
rev=\"2.9.0\" /> <dependency name=\"xmlrpc\" rev=\"2.0.1\" /> <dependency  
name=\"stax2\" rev=\"2.1\" /> <dependency name=\"wstx-lgpl\" rev=\"3.2.7\"  
/> <!-- JMX --> <dependency org=\"jmx\" name=\"jmxremote\" rev=\"1.0.1\" />  
<dependency org=\"jmx\" name=\"jmxtools\" rev=\"1.2.1\" /> <dependency  
org=\"jmx\" name=\"rmissl\" rev=\"1.0.1\" /> <!-- Mina --> <dependency  
org=\"mina\" name=\"mina-core\" rev=\"1.1.7\" /> <dependency org=\"mina\"  
name=\"mina-filter-ssl\" rev=\"1.1.7\" /> <dependency org=\"mina\"  
name=\"mina-integration-spring\" rev=\"1.1.7\" /> <dependency org=\"mina\"  
name=\"mina-integration-jmx\" rev=\"1.1.7\" /> <!-- Scripting -->  
<dependency org=\"asm\" name=\"asm\" rev=\"2.2.3\" /> <dependency  
org=\"asm\" name=\"asm-commons\" rev=\"2.2.3\" /> <dependency org=\"antlr\"  
name=\"antlr\" rev=\"2.7.6\" /> <dependency name=\"bsh\" rev=\"2.0b4\" />  
<dependency name=\"groovy\" rev=\"1.0\" /> <dependency name=\"jruby\"  
rev=\"1.0.3\" conf=\"java6->*\"/> <dependency name=\"jython\" rev=\"2.5\"  
/> <dependency org=\"spring\" name=\"spring-context-support\" rev=\"2.5.5\"  
/> <!-- Java5 support --> <dependency org=\"rhino\" name=\"js\"  
rev=\"1.6R7\" conf=\"java5->*\"/> <dependency name=\"jsr173_1.0_api\"  
rev=\"\" conf=\"java5->*\"/> <dependency name=\"jsr-223\" rev=\"1.0\"  
conf=\"java5->*\"/> <dependency name=\"js-engine\" rev=\"\"  
conf=\"java5->*\"/> <dependency name=\"jython-engine\" rev=\"\"  
conf=\"java5->*\"/> <dependency name=\"groovy-engine\" rev=\"\"  
conf=\"java5->*\"/> <dependency name=\"jruby\" rev=\"1.0.1\"  
conf=\"java5->*\"/> <dependency name=\"jruby-engine\" rev=\"\"  
conf=\"java5->*\"/> <!-- Crypto --> <dependency name=\"bcprov-jdk16\"  
rev=\"139\" conf=\"java6->*\"/> <dependency name=\"bcprov-jdk15\"  
rev=\"139\" conf=\"java5->*\"/> <!-- MP3 --> <dependency  
name=\"jaudiotagger\" rev=\"1.0.8\" /> <!-- Testing support --> <dependency  
name=\"junit\" rev=\"4.0\" conf=\"utest->eclipse\"/> <dependency  
name=\"GroboUtils\" rev=\"4-core\" conf=\"eclipse->*\"/> <dependency  
org=\"spring\" name=\"spring-test\" rev=\"2.5.5\" conf=\"eclipse->*\"/>  
<dependency name=\"jython-engine\" rev=\"\" conf=\"eclipse->*\"/>  
<dependency name=\"groovy-engine\" rev=\"\" conf=\"eclipse->*\"/>  
<dependency name=\"jruby-engine\" rev=\"\" conf=\"eclipse->*\"/>  
</dependencies></ivy-module>";
+	
+	@Test
+	public void testStringToDoc() throws IOException {
+		XMLUtils.stringToDoc(XML_STRING);
+		XMLUtils.stringToDoc(XML_STRING_HUGE);
+	
+	}
+
+	@Test
+	public void testDocToString() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testDocToString1() {
+		fail("Not yet implemented");
+	}
+
+	@Test
+	public void testDocToString2() {
+		fail("Not yet implemented");
+	}
+
+}

Added: repository/stax2-2.1.jar
==============================================================================
Binary file. No diff available.

Added: repository/stax2-3.0pr1.jar
==============================================================================
Binary file. No diff available.

Added: repository/wstx-lgpl-3.2.7.jar
==============================================================================
Binary file. No diff available.

Added: repository/wstx-lgpl-3.9.2.jar
==============================================================================
Binary file. No diff available.



More information about the Red5commits mailing list