of buffers and there are two pools one for each type of buffer both types of buffers are used to store attribute values for example in the following string with regard to the two types of buffers a first type of buffer is used when the attribute is simple and all that is needed to get the value is the starting and ending offsets to the buffer this is the type of buffer 212 illustrated in fig2 that is each pointer object in the buffer 212 is just a pointer to a set of characters in the reader buffer 208 as discussed above the first type of pointers are converted to string values and read into the scanner 204 in two scenarios the first scenario is that an attribute is read by the application and the corresponding attribute value is requested by the application the second scenario is that a callback 216 is received indicating the buffer 208 is about to be written over in the second scenario the attribute value is copied into the buffer 210 a second type of buffer illustrated in the simplified view in fig3 is used when attribute values are not simple and more processing is applied before giving an attribute value to the application the processing of the attribute value is applied when the scanner 304 is processing the buffer 308 in the reader again either due to the attribute being requested by the application 301 or due to a callback 316 being received by listener logic 313 corresponding to a listener object specified by the scanner 304 to the reader 302 indicated by arrow 314 indicating that the buffer 308 in the reader is about to be.