I have started to understand how the BeanInfo and MethodInfoCache classes works.
I see that the ProxyHelper will call MethodInfoCache public static <T> T createProxy(Endpoint endpoint, ClassLoader cl, Class<T>... interfaceClasses) throws Exception { return (T) createProxy(endpoint, cl, interfaceClasses, createMethodInfoCache(endpoint)); } in order to create the cache for the method and class but I don't see how/who is calling the ProxyHelper class and How the classes (to be scanned) are passed ? Regards, charles James.Strachan wrote: > > 2008/12/23 cmoulliard <cmoulli...@gmail.com>: >> >> Hi, >> >> I'm currently working on a small prototype to bind CSV data to POJOs >> using >> annotation. Camel through its component file:/// and dataformat will >> provide >> me the infrastructure that I need to parse the file content, extract each >> CSV record and return an array of String for each record found in a file. >> >> Remark : A string contains the list of CSV values separated by a comma. >> >> In order to bind the CSV values to my POJOs, I have created two >> annotations >> : >> >> @Retention(RetentionPolicy.RUNTIME) >> public @interface CSVRecord { >> >> String name(); --> root name of the class handling the content of >> a CSV >> record >> String separator(); --> separator used to separate CSV data >> >> } >> >> @Retention(RetentionPolicy.RUNTIME) >> public @interface CSVField { >> >> int pos(); --> key indicating the position of the CSV data in the >> CSV >> record >> String name(); --> key assigned to the column name of a CSV field >> >> } >> >> Here is an example of a POJO (= Model) using these annotations : >> >> @CSVRecord(separator =",", name = "OrderModel") >> public class OrderModel { >> >> @CSVField(name = "Number", pos = 0) >> String orderNr; >> >> @CSVField(name = "Client Number", pos = 1) >> String clientNr; >> >> @CSVField(name = "ISIN", pos = 2) >> String ISIN_Code; >> >> @CSVField(name = "Name", pos = 3) >> String Instrument_Name; >> >> @CSVField(name = "Quantity", pos = 4) >> String Quantity; >> >> @CSVField(name = "Cur", pos = 5) >> String Currency; > > Minor point - but you could use more defaults in that if you like. > e.g. default "," if its not specified and maybe default the name to be > the name of the field if its not specified (maybe even default the > position?) > > >> Here is my question ? >> >> Using reflection (or project ASM in an next step), I'm able at the launch >> of >> the application to discover all the fields annotated and their >> parameters. >> With this information, I'm able to set the field value with the CSV data >> using the following syntax : >> >> >> String[] result = record.split(csv.retrieveSeparator()); --> to retrieve >> the >> separator assigned to my CSVRecord >> .... >> field.set(order, result[csvField.pos()]); >> >> A CSV record can contain one or several classes like : >> - Order (with reference to a client, instrument, billing, ...), >> - Client, >> - Instrument, >> - Billing >> where annotations have been defined for the fields corresponding to what >> we >> have in CSV record. >> >> Remark : In this first prototype implementation, I will only support >> mapping >> 1-1 between objects >> >> Questions : >> >> 1) What is the best to strategy to recursively find all the annotated >> fields >> defined within the different classes ? > > Probably keeping a cache of class -> metadata rather like we do with > the annotation metadata for bean binding (see BeanInfo / > MethodInfoCache in the org.apache.camel.component.bean package). > > >> 2) Should we have to create a kind of java tree objects to store the >> annotated Fields with existing relation between the different classes (= >> model) ? >> >> ex : RootNode = Order, value = list of annotatedFields, childNode = >> Client, >> childNode = Instrument, ... >> >> 3) Is there performant java algorythm to read the Java Tree in order to >> find >> the annotated field corresponding to a key no matter if the field is >> defined >> in the parent node or any its children ? > > Not totally sure I follow this last bit. Are you talking about nested > CSVs? Or is it you flatten a master/detail type record into a single > row of the csv? The internals of JPA providers or JAXB could be useful > maybe (though possibly too complex :). > > Given the flat nature of a CSV its gonna be hard walking an arbitrary > object graph and mapping it to a row; but I guess for 1-1 > relationships you could bind nested fields (e.g. fields of Currency in > your example) as optional columns in the parent object's row. In this > special case though, just walking the field types (for non-primitive > types) would do the trick I think? You'd probably only be able to walk > one or two levels deep - and just keep track of types you've already > walked maybe? > > -- > James > ------- > http://macstrac.blogspot.com/ > > Open Source Integration > http://fusesource.com/ > > ----- Charles Moulliard SOA Architect My Blog : http://cmoulliard.blogspot.com/ http://cmoulliard.blogspot.com/ -- View this message in context: http://www.nabble.com/Advise-on-%40Annotation---Reflection-%21%21-tp21141422s22882p21146715.html Sent from the Camel - Users mailing list archive at Nabble.com.