jochen 2005/06/30 01:16:14
Modified: src/jaxme/org/apache/ws/jaxme/impl
JMUnmarshallerHandlerImpl.java
src/jaxme/org/apache/ws/jaxme/junit MarshallerTest.java
Log:
An IllegalStateException was thrown in a case, where a proper validationEvent
should have been fired.
Revision Changes Path
1.9 +27 -10
ws-jaxme/src/jaxme/org/apache/ws/jaxme/impl/JMUnmarshallerHandlerImpl.java
Index: JMUnmarshallerHandlerImpl.java
===================================================================
RCS file:
/home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/impl/JMUnmarshallerHandlerImpl.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- JMUnmarshallerHandlerImpl.java 24 Apr 2005 20:16:48 -0000 1.8
+++ JMUnmarshallerHandlerImpl.java 30 Jun 2005 08:16:13 -0000 1.9
@@ -224,24 +224,30 @@
break;
}
case STATE_COMPLEX_CONTENT:
+ JMSAXElementParser elementParser = (JMSAXElementParser)
activeParser;
if (lvl != endLevel) {
- throw new
IllegalStateException("Expected level " + endLevel
-
+ ", got " + lvl);
+ if (endLevel > lvl) {
+
validationEvent(ValidationEvent.ERROR,
+
"Premature endElement: " + new QName(pNamespaceURI, pLocalName),
+
ValidationEvents.EVENT_PREMATURE_END_ELEMENT,
+
null);
+ while (endLevel > lvl) {
+
terminateComplexType(pNamespaceURI, pLocalName, pQName,
+
elementParser);
+ }
+ } else {
+ throw new
IllegalStateException("Expected level " + endLevel
+
+ ", got " + lvl);
+ }
}
- JMSAXElementParser elementParser = (JMSAXElementParser)
activeParser;
if (elementParser.isAtomic()) {
elementParser.endElement(pNamespaceURI,
pLocalName, pQName, sb.toString());
}
if (pNamespaceURI.equals(elementParser.getNamespaceURI())
&&
pLocalName.equals(elementParser.getLocalName())) {
if (activeParser.isFinished()) {
- if (removeActiveParser()) {
-
activeParser.endElement(pNamespaceURI, pLocalName, pQName,
elementParser.result);
- } else {
- if (observer != null) {
-
observer.notify(result);
- }
- }
+ terminateComplexType(pNamespaceURI, pLocalName,
pQName,
+ elementParser);
return;
}
}
@@ -262,6 +268,17 @@
null);
}
+ private void terminateComplexType(String pNamespaceURI, String
pLocalName, String pQName,
+
JMSAXElementParser elementParser) throws SAXException {
+ if (removeActiveParser()) {
+ activeParser.endElement(pNamespaceURI, pLocalName, pQName,
elementParser.result);
+ } else {
+ if (observer != null) {
+ observer.notify(result);
+ }
+ }
+ }
+
public void characters(char[] pChars, int pOffset, int pLen) throws
SAXException {
switch (state) {
case STATE_SIMPLE_ATOMIC:
1.23 +43 -2
ws-jaxme/src/jaxme/org/apache/ws/jaxme/junit/MarshallerTest.java
Index: MarshallerTest.java
===================================================================
RCS file:
/home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/junit/MarshallerTest.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- MarshallerTest.java 10 Mar 2005 10:14:04 -0000 1.22
+++ MarshallerTest.java 30 Jun 2005 08:16:14 -0000 1.23
@@ -31,7 +31,9 @@
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
+import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.ValidationException;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
@@ -43,6 +45,8 @@
import org.apache.ws.jaxme.impl.DatatypeConverterImpl;
import org.apache.ws.jaxme.impl.JAXBContextImpl;
import org.apache.ws.jaxme.impl.JMMarshallerImpl;
+import org.apache.ws.jaxme.test.misc.address.Address;
+import org.apache.ws.jaxme.test.misc.address.AddressType;
import org.apache.ws.jaxme.test.misc.types.AllElement;
import org.apache.ws.jaxme.test.misc.types.AllSimpleTypes;
import org.apache.ws.jaxme.test.misc.types.AllTypesElement;
@@ -60,13 +64,15 @@
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
+import sun.security.validator.ValidatorException;
+
/**
* @author <a href="mailto:[EMAIL PROTECTED]">Jochen Wiedmann</a>
* @version $Id$
*/
public class MarshallerTest extends BaseTestCase {
- private JAXBContextImpl factory;
+ private JAXBContextImpl factory;
/** <p>Creates a new instance of MarshallerTest.</p>
*/
@@ -578,4 +584,39 @@
assertEquals(reh1.rootElementAttributes, reh2.rootElementAttributes);
assertEquals(getContents(s), getContents(got));
}
+
+
+ /** Tests unmarshalling of an invalid string into a JaxMe object.
+ */
+ public void testValidator() throws Exception {
+ String invalidAddress = // Note the missing "Last"
+ "<Address
xmlns=\"http://ws.apache.org/jaxme/test/misc/address\">\n" +
+ " <Name>\n" +
+ " <First>Jane</First>\n" +
+ " </Name>\n" +
+ "</Address>";
+ InputSource isource = new InputSource(new
StringReader(invalidAddress));
+ isource.setSystemId("testValidator.xml");
+ JAXBContext context =
JAXBContext.newInstance("org.apache.ws.jaxme.test.misc.address");
+ try {
+ context.createUnmarshaller().unmarshal(isource);
+ fail("No error reported.");
+ } catch (UnmarshalException e) {
+ // Ok
+ } catch (Throwable t) {
+ fail("Unexpected throwable " + t);
+ }
+
+ org.apache.ws.jaxme.test.misc.address.ObjectFactory of = new
org.apache.ws.jaxme.test.misc.address.ObjectFactory();
+ Address address = of.createAddress();
+ address.setName(of.createAddressTypeNameType());
+ AddressType.NameType name = address.getName();
+ name.setFirst("Jane");
+ try {
+
assertFalse(context.createValidator().validate(address));
+ } catch (Throwable t) {
+ t.printStackTrace();
+ fail("Unexpected throwable " + t);
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]