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]

Reply via email to