jochen 2005/06/30 01:14:18 Modified: src/jaxme/org/apache/ws/jaxme/impl Tag: v0_4 JMUnmarshallerHandlerImpl.java src/jaxme/org/apache/ws/jaxme/junit Tag: v0_4 MarshallerTest.java Log: An IllegalStateException was thrown in a case, where a proper validationEvent should have been fired. Revision Changes Path No revision No revision 1.6.2.2 +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.6.2.1 retrieving revision 1.6.2.2 diff -u -r1.6.2.1 -r1.6.2.2 --- JMUnmarshallerHandlerImpl.java 18 Apr 2005 20:31:49 -0000 1.6.2.1 +++ JMUnmarshallerHandlerImpl.java 30 Jun 2005 08:14:18 -0000 1.6.2.2 @@ -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); + } + } + } + private boolean isEmpty(char[] pChars, int pOffset, int pLen) { for (int i = 0; i < pLen; i++) { if (!Character.isWhitespace(pChars[pOffset+i])) { No revision No revision 1.22.2.1 +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.22.2.1 diff -u -r1.22 -r1.22.2.1 --- MarshallerTest.java 10 Mar 2005 10:14:04 -0000 1.22 +++ MarshallerTest.java 30 Jun 2005 08:14:18 -0000 1.22.2.1 @@ -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]