[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