replaced all StringBuffers with StringBuilder to improve performance
[Bob.git] / doc / Architecture.rtf
blob954ad63d18c229610a8ac925fef66befa92226ea
1 {\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420\r
2 {\fonttbl\f0\fswiss\fcharset77 Helvetica;\f1\fswiss\fcharset77 Helvetica-Bold;\f2\fswiss\fcharset77 Helvetica-BoldOblique;\r
3 }\r
4 {\colortbl;\red255\green255\blue255;}\r
5 \margl1440\margr1440\vieww18480\viewh15460\viewkind0\r
6 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural\r
7 \r
8 \f0\fs24 \cf0 \\r
9 \\r
10 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural\r
12 \f1\b \cf0 HISTORY\r
13 \f0\b0 \\r
14 \\r
15 The idea for Bob was spun around 2002. I had left a software company, Channelwave ( formerly "Unbeatable Drums" )  and wanted to keep using a RAD tool that someone there had custom built. This was a full fledged XML/Java binding tool before they became fashionable. And they are still in the realm of more advanced architectures. The tool was called Xampl and the person who wrote it was Bob Hutchison. I had been using Xampl for about 1 to 1 1/2 years and had gotten used to the idea of designing your software objects into a composite pattern (tree structure ) in XML, then using the generated Java classes in your code. \\r
16 \\r
17 So after I left the company, I asked Bob if he was going to make Xampl available in the open source community. He said he had thought about it, but was going through some code ownership issues about it. So a bit of time passed - I think about a year, before I started wanting to write my own projects and thought that an XML/Java tool would be handy. Xampl was still not going to be available for some time. So being the impatient person that I am, I thought that it would be achievable for me to just write a similar tool. I was very familiar with the SAX2 callback algorithm, and had a solid idea of how the generation process would work. So, near the end of 2003, in a few months I had an early prototype that was generating Java code and implementing some of the core functionality that I had used in Xampl ( visitor design pattern, XML marshaling, etc ). The name didn't take me long either. I did want to make it obvious that I was working on top of ideas that cam e before me. Also, the name 'Bob' sounds sort of cool in a commercially soaked atmosphere ( I just remembered those Chees - Os commercials where the cat wondered if Bob had taken his cheese-ees ). So 'Bob' it was. \\r
18 \\r
19 This early version of Bob sat on my computer for about another year while I used it for small 1 off software ideas. I remember not wanting to lose my work if my computer had crashed. Even though I burned backups of my code every so often, I knew that version control would be the best approach for maintaining the code over the long term. I put the thing into CVS in 2004, and it stayed there without any real improvements for another chunk of time ( not quite a year ). By the time I got around to making a bundle that someone could download and start to play with, I started thinking that when someone downloads my software, it should just work without any real major modifications coming form me. I couldn't imagine someone taking the time to email me about a feature that would be useful, and then wait while I coded the thing. \\r
20 \\r
21 Around this time, 3 things happened to me all at once. I thought it would be useful if there was a proof-of-concept that used Bob. I also was doing my taxes and journal entries for the year, and couldn't find software that did simple double-entry bookkeeping properly. I was also a voracious reader and armchair political philosopher. I had always wanted a concise and powerful way to express solutions to functionally complex software problems. So I was starting to warm to the idea of custom languages that are designed for very specific problem - Domain specific languages.  I was really into Noam Chomsky, politically, and was also reading his original linguistics research. The logic was kind of overwhelming, but I had understood the purpose and context of the mathematical model he used. And I realised that his linguistics breakthrough ( I think in 1956 ) had not only changed the whole school of linguistics, but also had a major influence in Computer Science and language design. It was intriguing to me that Chomsky's central assertion of an innate language facility in each person, could be mapped out mathematically, which described the kind of expressiveness I was looking for in my software designs. I decided to learn how to design grammars as I had realised that languages and custom grammars would go a far way in giving me the expressive powers I craved - I just needed some software in which I could use a custom grammar. This lead me to write a bookkeeping software package that would 1) do bookkeeping as I thought it should be done 2) use 'Bob' and 3) give me an opportunity to design and implement a custom grammar. So 'Bob' flows quite nicely into 'Bookkeeping', the project that uses it, and served as a test and design bench. \\r
22 \\r
23 \\r
25 \f1\b PURPOSE\\r
26 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural\r
28 \f0\b0 \cf0 I originally desired a \r
29 \f1\b 1) Rapid Application Development (RAD)\r
30 \f0\b0  software tool that would allow me to quickly express software structure. I also wanted to \r
31 \f1\b 2) easily read and write data from my applications\r
32 \f0\b0 , without a lot of data mapping - I find it to be costly in time and error-prone. XML is of course the language agnostic, data format du jour, and was how I was handling data back then. Therefore, it was a natural choice as a data format. 'Bob' was designed to accommodate these needs. \\r
33 \\r
34 \\r
35 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural\r
37 \f1\b \cf0 FUNCTIONALITY \r
38 \f0\b0 \\r
39 - Bob generates Java source code based on 1 - 'n' example XML documents, which represent the software structure as a '\r
40 \f1\b Composite\r
41 \f0\b0 ' pattern or a tree structure \\r
42 \r
43 \f1\b XML Namespaces\r
44 \f0\b0  fully incorporated used to package generated Java code \\r
45 - Runtime generated Java code can \r
46 \f1\b marshall\r
47 \f0\b0 ( write to XML ) and \r
48 \f1\b unmarshall\r
49 \f0\b0 ( to Java ) \\r
50 - Full implementation of '\r
51 \f1\b Visitor\r
52 \f0\b0 ' pattern in object tree \\r
53 - Each object node in the composite object tree implements i) \r
54 \f2\i\b finders\r
55 \f0\i0\b0 , \r
56 \f2\i\b listers\r
57 \f0\i0\b0 , \r
58 \f2\i\b adders\r
59 \f0\i0\b0 , and \r
60 \f2\i\b removers\r
61 \f0\i0\b0  for each child element and ii) \r
62 \f2\i\b accessors\r
63 \f0\i0\b0  for class attribute values \\r
64 \\r
65 \\r
67 \f1\b ARCHITECTURE\\r
68 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural\r
70 \f0\b0 \cf0 The basic architecture revolves around the SAX mechanism, with handlers that generate i) Definitions ii) Java files iii) Bob objects \\r
71 \\r
72 \\r
73 \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural\r
75 \f1\b \cf0 CHALLENGES & CONSTRAINTS\r
76 \f0\b0 \\r
77 - merging definitions\\r
78 - implementing Queueing algorithm \\r
79 - testing callback methods \\r
80 \\r
81 \\r
83 \f1\b FUTURE \r
84 \f0\b0 \\r
85 - support for XQuery (including XPath and XPointer) for traversing 'Bob' objects \\r
86 - code generation from XML and Relax schemas ( currently only supports XML documents ) \\r
87 \\r
88 \\r
89 \\r
90 \\r
91 \\r
92 >>>>>>>>>>>>>>>>\\r
93 SAX XML -> Handler ( Definitions, JavaWriter, BobCreator )\\r
94 \\r
95 \\r
96                         FileReading             Queues  Generator\\r
97 \\r
98 \\r
99 \\r
101 \f1\b CHALLENGES & CONSTRAINTS\r
102 \f0\b0 \\r
103 - merging definitions\\r
104 - implementing Queueing algorithm \\r
105 - testing callback methods \\r
110 \f1\b FUTURE \r
111 \f0\b0 \\r
112 - support for XQuery (including XPath and XPointer) for traversing 'Bob' objects \\r
113 - code generation from XML and Relax schemas ( currently only supports XML documents ) \\r