jochen 2005/07/30 14:05:16 Modified: src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg GroupHandlerSG.java SimpleContentHandlerSG.java HandlerSGImpl.java src/test/jaxb types.xsd src/jaxme/org/apache/ws/jaxme/generator/types StringSG.java src/jaxme/org/apache/ws/jaxme/junit JiraTest.java Log: An IllegalStateException was thrown, if a facet violation was detected in the Unmarshaller. This is now changed to a proper ValidationEvent. PR: JAXME-62 Revision Changes Path 1.9 +31 -9 ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java Index: GroupHandlerSG.java =================================================================== RCS file: /home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/GroupHandlerSG.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- GroupHandlerSG.java 20 Jul 2005 20:48:29 -0000 1.8 +++ GroupHandlerSG.java 30 Jul 2005 21:05:15 -0000 1.9 @@ -27,7 +27,11 @@ import org.apache.ws.jaxme.generator.sg.GroupSG; import org.apache.ws.jaxme.generator.sg.ObjectSG; import org.apache.ws.jaxme.generator.sg.ParticleSG; +import org.apache.ws.jaxme.generator.sg.PropertySG; +import org.apache.ws.jaxme.generator.sg.PropertySGChain; import org.apache.ws.jaxme.generator.sg.TypeSG; +import org.apache.ws.jaxme.generator.sg.impl.PropertySGChainImpl; +import org.apache.ws.jaxme.generator.sg.impl.PropertySGImpl; import org.apache.ws.jaxme.impl.JMSAXElementParser; import org.apache.ws.jaxme.impl.JMSAXGroupParser; import org.apache.ws.jaxme.impl.JMUnmarshallerHandlerImpl; @@ -321,20 +325,38 @@ TypedValue v = getParamResult(); if (childType.isComplex()) { type = childType.getComplexTypeSG().getClassContext().getXMLInterfaceName(); + if (isMixed) { + pJm.addLine(pElement, ".getContent().add(", v, ");"); + } else { + pParticle.getPropertySG().addValue(pJm, pElement, v, type); + } } else { - v = createSimpleTypeConversion(pJm, childType, v, oSG.getName().toString()); - type = null; + PropertySG pSG; + DirectAccessible element; if (isMixed) { LocalJavaField f = pJm.newJavaField(GroupUtil.getContentClass(group, pParticle, ctSG.getClassContext().getXMLInterfaceName())); f.addLine("new ", GroupUtil.getContentClass(group, pParticle, ctSG.getClassContext().getXMLImplementationName()), "()"); - pJm.addLine(f, ".setValue(", v, ");"); - v = f; + PropertySGChain chain = ((PropertySGImpl) pParticle.getPropertySG()).getHeadOfChain(); + PropertySGChain head = new PropertySGChainImpl(chain){ + public String getXMLFieldName(PropertySG pController) throws SAXException { + return "_value"; + } + public String getPropertyName(PropertySG pController) throws SAXException { + return "value"; + } + }; + pSG = new PropertySGImpl(head); + element = f; + } else { + pSG = pParticle.getPropertySG(); + element = pElement; + } + createSimpleTypeConversion(pJm, childType, v, + oSG.getName().toString(), + pSG, element); + if (isMixed) { + pJm.addLine(pElement, ".getContent().add(", element, ");"); } - } - if (isMixed) { - pJm.addLine(pElement, ".getContent().add(", v, ");"); - } else { - pParticle.getPropertySG().addValue(pJm, pElement, v, type); } pJm.addLine("return;"); pJm.addEndIf(); 1.7 +4 -4 ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/SimpleContentHandlerSG.java Index: SimpleContentHandlerSG.java =================================================================== RCS file: /home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/SimpleContentHandlerSG.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SimpleContentHandlerSG.java 7 May 2005 19:42:26 -0000 1.6 +++ SimpleContentHandlerSG.java 30 Jul 2005 21:05:15 -0000 1.7 @@ -21,7 +21,6 @@ import org.apache.ws.jaxme.js.JavaQName; import org.apache.ws.jaxme.js.JavaSource; import org.apache.ws.jaxme.js.LocalJavaField; -import org.apache.ws.jaxme.js.TypedValue; import org.xml.sax.SAXException; @@ -43,9 +42,10 @@ LocalJavaField element = result.newJavaField(elementInterface); element.addLine("(", elementInterface, ") result"); SimpleContentSG scSG = ctSG.getSimpleContentSG(); - TypedValue tv = createSimpleTypeConversion(result, scSG.getContentTypeSG(), - getParamResult(), scSG.getPropertySG().getPropertyName()); - scSG.getPropertySG().addValue(result, element, tv, null); + createSimpleTypeConversion(result, scSG.getContentTypeSG(), + getParamResult(), + scSG.getPropertySG().getPropertyName(), + scSG.getPropertySG(), element); return result; } } 1.4 +9 -22 ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/HandlerSGImpl.java Index: HandlerSGImpl.java =================================================================== RCS file: /home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/sg/impl/ccsg/HandlerSGImpl.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- HandlerSGImpl.java 28 Apr 2005 23:57:53 -0000 1.3 +++ HandlerSGImpl.java 30 Jul 2005 21:05:15 -0000 1.4 @@ -25,8 +25,8 @@ import org.apache.ws.jaxme.ValidationEvents; import org.apache.ws.jaxme.generator.sg.AttributeSG; import org.apache.ws.jaxme.generator.sg.ComplexTypeSG; +import org.apache.ws.jaxme.generator.sg.PropertySG; import org.apache.ws.jaxme.generator.sg.TypeSG; -import org.apache.ws.jaxme.generator.types.BooleanSG; import org.apache.ws.jaxme.generator.types.StringSG; import org.apache.ws.jaxme.js.DirectAccessible; import org.apache.ws.jaxme.js.JavaMethod; @@ -138,8 +138,9 @@ jm.addIf(firstInNamespace, JavaSource.getQuoted(attr.getName().getLocalName()), ".equals(", pLocalName, ")"); firstInNamespace = false; - TypedValue v = createSimpleTypeConversion(jm, myAttributes[i].getTypeSG(), pValue, "@" + myAttributes[i].getName()); - attr.getPropertySG().setValue(jm, result, v, null); + createSimpleTypeConversion(jm, myAttributes[i].getTypeSG(), pValue, + "@" + myAttributes[i].getName(), + attr.getPropertySG(), result); jm.addLine("return;"); } if (!firstInNamespace) { @@ -220,40 +221,26 @@ return jm; } - protected TypedValue createSimpleTypeConversion(JavaMethod pJm, TypeSG pType, - TypedValue pValue, String pName) + protected void createSimpleTypeConversion(JavaMethod pJm, TypeSG pType, + TypedValue pValue, String pName, + PropertySG pPropertySG, + DirectAccessible pElement) throws SAXException { - JavaQName runtimeType = pType.getSimpleTypeSG().getRuntimeType(); boolean causingParseConversionEvent = pType.getSimpleTypeSG().isCausingParseConversionEvent(); - LocalJavaField f = null; if (causingParseConversionEvent) { - f = pJm.newJavaField(runtimeType); pJm.addTry(); } Object s = new Object[]{"(", StringSG.STRING_TYPE, ") ", pValue}; TypedValue result = new TypedValueImpl(pType.getSimpleTypeSG().getCastFromString(pJm, s, "getHandler()"), pType.getSimpleTypeSG().getRuntimeType()); + pPropertySG.addValue(pJm, pElement, result, null); if (causingParseConversionEvent) { - pJm.addLine(f, " = ", result, ";"); - result = f; DirectAccessible e = pJm.addCatch(Exception.class); pJm.addLine("getHandler().parseConversionEvent(", JavaSource.getQuoted("Failed to convert value of " + pName + ": "), " + ", pValue, ", ", e, ");"); - Object o; - if (runtimeType.isPrimitive()) { - if (BooleanSG.BOOLEAN_TYPE.equals(runtimeType)) { - o = "false"; - } else { - o = "0"; - } - } else { - o = "null"; - } - pJm.addLine(f, " = ", o, ";"); pJm.addEndTry(); } - return result; } public void generate() throws SAXException { 1.14 +26 -0 ws-jaxme/src/test/jaxb/types.xsd Index: types.xsd =================================================================== RCS file: /home/cvs/ws-jaxme/src/test/jaxb/types.xsd,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- types.xsd 20 Jul 2005 20:48:30 -0000 1.13 +++ types.xsd 30 Jul 2005 21:05:15 -0000 1.14 @@ -299,4 +299,30 @@ </xs:sequence> </xs:complexType> </xs:element> + + <xs:element name="jira62"> + <xs:complexType> + <xs:attribute name="a" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:maxLength value="4"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="b" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:minLength value="4"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="c" use="optional"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:length value="4"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + </xs:element> </xs:schema> 1.5 +4 -4 ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/types/StringSG.java Index: StringSG.java =================================================================== RCS file: /home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/generator/types/StringSG.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- StringSG.java 28 Apr 2005 23:57:53 -0000 1.4 +++ StringSG.java 30 Jul 2005 21:05:15 -0000 1.5 @@ -141,21 +141,21 @@ pMethod.addIf(pValue, ".length()", " > ", maxLength); pMethod.addThrowNew(IllegalArgumentException.class, JavaSource.getQuoted("Length of " + maxLength + " characters exceeded: "), - " + ", pValue); + " + ", pValue); pMethod.addEndIf(); } if (minLength != null) { pMethod.addIf(pValue, ".length()", " < ", minLength); pMethod.addThrowNew(IllegalArgumentException.class, - JavaSource.getQuoted("Length of " + minLength + " characters exceeded: "), - " + ", pValue); + JavaSource.getQuoted("Minimum length of " + minLength + " characters not matched: "), + " + ", pValue); pMethod.addEndIf(); } if (length != null) { pMethod.addIf(pValue, ".length()", " != ", length); pMethod.addThrowNew(IllegalArgumentException.class, JavaSource.getQuoted("Length of " + length + " characters not matched: "), - " + ", pValue); + " + ", pValue); pMethod.addEndIf(); } if (pValue.isNullable()) { 1.9 +48 -2 ws-jaxme/src/jaxme/org/apache/ws/jaxme/junit/JiraTest.java Index: JiraTest.java =================================================================== RCS file: /home/cvs/ws-jaxme/src/jaxme/org/apache/ws/jaxme/junit/JiraTest.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- JiraTest.java 7 May 2005 20:37:35 -0000 1.8 +++ JiraTest.java 30 Jul 2005 21:05:15 -0000 1.9 @@ -4,6 +4,10 @@ import java.io.StringWriter; import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.ValidationEvent; +import javax.xml.bind.ValidationEventHandler; import magoffin.matt.ieat.domain.impl.IngredientImpl; import net.dspc.commons.activitymodel.TransmissionData; @@ -16,12 +20,11 @@ import org.apache.ws.jaxme.generator.impl.GeneratorImpl; import org.apache.ws.jaxme.generator.sg.SchemaSG; import org.apache.ws.jaxme.generator.sg.impl.JAXBSchemaReader; -import org.apache.ws.jaxme.generator.sg.impl.JAXBSchemaSG; import org.apache.ws.jaxme.generator.util.JavaNamer; +import org.apache.ws.jaxme.test.misc.types.Jira62; import org.apache.ws.jaxme.test.misc.types.Row; import org.apache.ws.jaxme.test.misc.types.impl.RowImpl; import org.apache.ws.jaxme.test.misc.xsimport.a.Outer; -import org.apache.ws.jaxme.xs.xml.XsQName; import org.xml.sax.InputSource; @@ -150,4 +153,47 @@ assertEquals("Element1", JavaNamer.convert("element1", schema)); assertEquals("Element_1", JavaNamer.convert("element_1", schema)); } + + /** Test for <a href="http://issues.apache.org/jira/browse/JAXME-62">JAXME-62</a>. + */ + public void testJAXME62() throws Exception { + for (int i = 0; i < 6; i++) { + runFacetTest(i, "a", i < 5); + } + for (int i = 0; i < 6; i++) { + runFacetTest(i, "b", i > 3); + } + for (int i = 0; i < 6; i++) { + runFacetTest(i, "c", i == 4); + } + } + + private static class EventDetector implements ValidationEventHandler { + private boolean gotEvent = false; + public boolean handleEvent(ValidationEvent pEvent) { + gotEvent = true; + return true; + } + boolean isSuccess() { return !gotEvent; } + }; + + private void runFacetTest(int i, String pAttrName, boolean pSuccess) throws JAXBException { + JAXBContext ctx = super.getJAXBContext(Jira62.class); + String xml = + "<ex:jira62" + + " xmlns:ex='http://ws.apache.org/jaxme/test/misc/types'" + + " " + pAttrName + "='"; + for (int j = 0; j < i; j++) { + xml += (char) ('0' + j); + } + xml += "'/>"; + System.out.println("Parsing " + xml); + InputSource isource = new InputSource(new StringReader(xml)); + isource.setSystemId("testJAXME62-a-" + i + ".xsd"); + EventDetector ed = new EventDetector(); + Unmarshaller u = ctx.createUnmarshaller(); + u.setEventHandler(ed); + u.unmarshal(isource); + assertEquals(pSuccess, ed.isSuccess()); + } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]