Hi Scott, let me try to address som eof your questions piece by piece ...
Werner Scott Purcell wrote: > Thanks for the info, still trying to get my head around this. > > The actual example I am working with is the "invoice.xsd" that is included > in the source. < found here: > http://www.castor.org/srcgen-example.html#Running-the-XML-code-generator> > It was analogous to what I am trying to achieve. So I took the invoice.xsd > and simply ran source generator command like so: > < > > > > > java -cp %CP% org.exolab.castor.builder.SourceGeneratorMain -i invoice.xsd > -package test You are aware that Castor offers integration for both Ant as well as Maven, right ? Personally, using a command line interface appears a bit complicated to me when I do have the richness of Ant task definitions and Maven plugins. > > That command created java files for each of the complex types and a > directory named "descriptors" which also have java files in there. > > Could someone explain the difference between the src and the descriptors? > What is each of their jobs? >This is my first run with XML to java binding. Well, let's start wit the wording, if you do not mind .. ;-). You just used the XML code generator to create Java source code from your XML schema. As you have noticed yourself, the artifacts that have been produced by this source generation (step) are two-fold: a) Java domain classes, more or less one for each XMl schema artifact (e.g. a Java class for a complex type definition, etc.). b) A descriptor class for each domain class generated. These classes partially share the name with the domain class, i.e. for a class Stock being generated you'll find the corresponding StockDescriptor in the descriptors package. The Java domain class simply is the Java representation of your XML schema artifact. The descriptor class is a class used by Castor internally to facilitate XML data binding (unmarshalling and marshalling) between the domain classes just generated any XML document instances. I don't know whether you have written a mapping file already to map an (existing) set of java classes to XML (or not), but in any case Castor (at startup) will analyze your mappings and produce what we call descriptors for each class (and field) being mapped. In your case, you are generating your Java source code from an XML schema. Rather than asking you to supply us (Castor) with a mapping, we use a different strategy here. Remember, the Castor XML code generator takes your XML schema and geenrates domain classes. Well, it creates descriptor classes as well, deriving all required information (node names, namespace URIs, namespace prefices, ....) from your XML schema Later on, when you are using the generated clases for (un-)marshalling, Castor will be able to use those descriptor classes and e.g. produce XML that exactly matches your XML schema (which happened to be at the start of the process). Does this make more sense now ? > > Secondly, I decided to try and marshall this, so I created a Invoice item, > and added ShipTo, Customer, Item, ItemAttributes, etc. objects to the > invoice in an attempt to marshall the data like so: (see test class), but > I am unable to get the "duration" to work. I get errors like so: > see (error below). > > // test class > public static void main(String[] args) { > > > Item item = new Item(); > item.setQuantity(100000); > item.setId("1"); > item.setInStock(false); > item.setCategory("my_category"); > item.setPrice(new BigDecimal("100.00")); > > Address address = new Address(); > address.setCity("my_city"); > address.setState("MO"); > address.setStreet1("76777777 mockingbird"); > address.setStreet2("other street"); > address.setZipCode("77779"); > > Customer customer = new Customer(); > customer.setName("Scott"); > customer.setPhone("300-300-3333"); > customer.setAddress(address); > > ShipTo shipto = new ShipTo(); > shipto.setCustomer(customer); > > ShippingMethod shipmethod = new ShippingMethod(); > shipmethod.setCarrier("carrier"); > shipmethod.setOption("UPS"); > > Invoice inv = new Invoice(); > inv.setShippingMethod(shipmethod); > inv.setShipTo(shipto); > inv.addItem(item); > > > try { > FileWriter writer = new FileWriter("invoice.xml"); > Marshaller.marshal(inv, writer); > } catch (Exception e) { > System.err.println(e.getMessage()); > e.printStackTrace(System.err); > } > } > > > > error: > The following exception occured while validating field: _shippingMethod of > class: com.Invoice: The field '_estimatedDelivery' (whose xml name is > 'estimated-delivery') is a required field of class 'com.ShippingMethod If you look at this exception in detail, you'll come to see (after having used Castor more frequently) that Castor tries to validate your object instance before marshalling, something no other tool is capable of doing (to my knowledge). And as it happens, your XML schema defines that there needs to be a value for the property 'estimatedDelivery' of ShippingMethod, as you have defined it to be required in your XML schema. Simply add a {code} shipMethod.setEstimatedDelivery(...); {code} statement to your test case above and you should be fine (given that there's no other problems). >The following exception occured while validating > field: _shippingMethod of class: com.Invoice: The field > '_estimatedDelivery' (whose xml name is 'estimated-delivery') is a > required field of class 'com.ShippingMethod; > - location of error: XPATH: /invoice > The field '_estimatedDelivery' (whose xml name is 'estimated-delivery') is > a required field of class 'com.ShippingMethod > at > org.exolab.castor.xml.FieldValidator.validate(FieldValidator.java:278) > at > org.exolab.castor.xml.util.XMLClassDescriptorImpl.validate(XMLClassDescriptorImpl.java:1065) > at org.exolab.castor.xml.Validator.validate(Validator.java:135) > at org.exolab.castor.xml.Marshaller.validate(Marshaller.java:2594) > at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:826) > at > org.exolab.castor.xml.Marshaller.staticMarshal(Marshaller.java:798) > at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:727) > at com.ExerciseInvoice.main(ExerciseInvoice.java:58) > Caused by: ValidationException: The field '_estimatedDelivery' (whose xml > name is 'estimated-delivery') is a required field of class > 'com.ShippingMethod; > - location of error: XPATH: /shipping-method > at > org.exolab.castor.xml.FieldValidator.validate(FieldValidator.java:210) > at > org.exolab.castor.xml.util.XMLClassDescriptorImpl.validate(XMLClassDescriptorImpl.java:1065) > at org.exolab.castor.xml.Validator.validate(Validator.java:135) > at > org.exolab.castor.xml.FieldValidator.validateInstance(FieldValidator.java:326) > at > org.exolab.castor.xml.FieldValidator.validate(FieldValidator.java:271) > ... 7 more > Caused by: ValidationException: The field '_estimatedDelivery' (whose xml > name is 'estimated-delivery') is a required field of class > 'com.ShippingMethod; > - location of error: XPATH: /shipping-method > at > org.exolab.castor.xml.FieldValidator.validate(FieldValidator.java:210) > at > org.exolab.castor.xml.util.XMLClassDescriptorImpl.validate(XMLClassDescriptorImpl.java:1065) > at org.exolab.castor.xml.Validator.validate(Validator.java:135) > at > org.exolab.castor.xml.FieldValidator.validateInstance(FieldValidator.java:326) > at > org.exolab.castor.xml.FieldValidator.validate(FieldValidator.java:271) > at > org.exolab.castor.xml.util.XMLClassDescriptorImpl.validate(XMLClassDescriptorImpl.java:1065) > at org.exolab.castor.xml.Validator.validate(Validator.java:135) > at org.exolab.castor.xml.Marshaller.validate(Marshaller.java:2594) > at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:826) > at > org.exolab.castor.xml.Marshaller.staticMarshal(Marshaller.java:798) > at org.exolab.castor.xml.Marshaller.marshal(Marshaller.java:727) > at com.ExerciseInvoice.main(ExerciseInvoice.java:58) > > > Any help??? > Thanks, > Scott > > > > > > Werner Guttmann <[EMAIL PROTECTED]> > 07/04/2008 02:15 AM > Please respond to > [email protected] > > > To > [email protected] > cc > > Subject > Re: [castor-user] How to Populate Binding Objects > > > > > > > Scott, > > Scott Purcell wrote: >> Hello, >> >> I have created a XSD document with many complex types, and have used the > >> XML Code generator (SourceGeneratorMain) to create java binding files. >> This is all good and works well. > Hmm ... let me try to understand one thing here. When you have used the > XML code generator, you have turned off creastion of descriptor classes > and turned on creation of a mapping file, correct ? If that's the case, > why ? It should be the other way around. See below ..... > > Please note, that a binding file is something completely different. > The term 'binding file' is used in the context of code generation to > overcome naming collisions. > >> Now, I need to somehow (this is where my question lies) "instantiate" > the >> binding files, populate them, and then marshal the objects to XML. I am >> not sure how this is accomplished? Could someone give me some insight as > >> to how this works? >> >> My workflow will be like so: >> Once the binding files are created (which they are) I have the need to >> instantiate the objects, populate them with different data and then >> marshall the data to xml. > > Assuming that you have generated source code (including descriptor > classes, that is) from your XML schema, here's what you have to do to > marshal an object instance to XML. > > <code> > XMLContext context = new XMLContext(); > > Marsdaller marshaller = context.createMarshaller(); > > YourObject yourObject = .... ; > > marshaller.marshal(yourObject); > </code> > > If (and only if) you have the descriptor classes on your classpath, > Castor will just marshal XML according to your definitions in your XMl > schema. > > Does this make sense ? > > Werner >> Thanks, >> Scott >> >> >> >> >> >> CONFIDENTIALITY NOTICE >> This e-mail message and any attachments are only for the use of the > intended recipient and may contain information that is privileged, > confidential or exempt from disclosure under applicable law. If you are > not the intended recipient, any disclosure, distribution or other use of > this e-mail message or attachments is prohibited. If you have received > this e-mail message in error, please delete and notify the sender > immediately. Thank you. > > --------------------------------------------------------------------- > To unsubscribe from this list, please visit: > > http://xircles.codehaus.org/manage_email > > > > > > > > CONFIDENTIALITY NOTICE > This e-mail message and any attachments are only for the use of the intended > recipient and may contain information that is privileged, confidential or > exempt from disclosure under applicable law. If you are not the intended > recipient, any disclosure, distribution or other use of this e-mail message > or attachments is prohibited. If you have received this e-mail message in > error, please delete and notify the sender immediately. Thank you. --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email

