replaced all StringBuffers with StringBuilder to improve performance
[Bob.git] / TODO
blob186e7a6cfeebe2b68f0e79eabbe9a6d0c7dcdf77
1 \r
2 TODO 'Bob'\r
3 \r
4 \r
5 >>>>>>>>>>>>>>>>>>>>>>> PUBLISH\r
6     - Apple's Developer Site\r
7     - Sourceforge\r
8 \r
9 \r
10 >>>>>>>>>>>>>>>>>>>>>>> TODO\r
12 ** [ERROR] Error in 'Bob' namespace to package file writing. Occurs when a grandchild that declares it's \r
13 own namespace (xmlns) and does not use a pre-packaged one (xmlns:myns). That child namespace will be \r
14 carried to the root node and that node file will be written to the child namespace/package directory.\r
15 ** The root packaging remains intact(correct) however. See bookkeeping.users.xml for error\r
16 <?xml version='1.0' encoding='UTF-8'?>  \r
17 <system xmlns='com/interrupt/bookkeeping' \r
18                 xmlns:users='com/interrupt/bookkeeping/users' \r
19                 xmlns:bkell='com/interrupt/bookkeeping/bkell' \r
20                 xmlns:command='com/interrupt/bookkeeping/bkell/command'\r
21                 id='' > \r
22         \r
23         <!-- The bkell(shell) sub-system\r
24         -->\r
25         <bkell xmlns='com/interrupt/bookkeeping/bkell' >\r
26                 \r
27                 <commands xmlns='com/interrupt/bookkeeping/bkell/command' id='' >\r
28                 \r
29                         <command token='' >\r
30                                 \r
31                                 \r
32                                 <options id='' >\r
33                                         <option name='' value='' />\r
34                                 </options>\r
35                         </command>\r
36                 </commands>\r
37                 \r
38         </bkell>\r
39 </system>\r
42 -- have load() & make() usable without instantiating a bob object \r
44 -- test IBob.search() \r
45 -- format gen code\r
46 -- refactor the BobComparator \r
47 -- IBob.getAttributes; make this return AttributesImpl with all the current values in IBob \r
48 -- include proper logging (log4J, AspectJ)\r
50 ** ANT **\r
51 -- make ant traverse targets & descriptions for 'usage'\r
53 -- more elaborate search using\r
54         i. multiple tag / attribute criteria & regex \r
55         ii. xpath expressions \r
56         \r
57 -- 'Bob' support for xpath, xpointer, xquery, xupdate\r
58 -- user can specify name of generated subclasses; default to 'GClazz' for <clazz />\r
59 -- user can specify custom methods; what if you want to put extra methods on a 'gen' interface; plug-ins\r
60 -- checkout competition: \r
61     Castor \r
62     'JAXB' [OK]\r
63         JAXB ri \r
64         XStream \r
65         XMLBeans \r
66         Jaxme \r
68 -- gen java code from (schema name being roundtrippable) :\r
69     [OK] xml\r
70     - xml schema\r
71     - Relax schema from schemas\r
73 [not yet] compiler switch for 'Generics' (too early; not supported)\r
74 [not yet] include test code coverage. try Clover (http://www.cenqua.com/clover/)\r
78 >>>>>>>>>>>>>>>>>>>>>>> ISSUES\r
81 >>>>>>>>>>>>>>>>>>>>>>> RESEARCH\r
82 [x] JDO\r
83 [DONE] Java Pretty Printer\r
84     - Jalopy has too many jars to include in release\r
87 >>>>>>>>>>>>>>>>>>>>>>> DONE \r
88 [DONE] callback mechanism\r
89 [DONE] abstract way to pull in files\r
90     - using javaFind(https://sourceforge.net/projects/javafind/)\r
91 [DONE] write 'all[Array]()' function; default with empty attribute children  \r
92 [DONE] put text into the base definition of IBob\r
93 [DONE] write 'toXML()' function\r
94     Q. how to deal with multiple namespaces in child/parent tags\r
95     A. if a child has several namespaces not defined by an ancestor, \r
96     but not a ns for itself, then write those ones out.\r
97 [DONE] reading xml from directories (non-xml files break the system)\r
98 [DONE] ** FIX ** weirdness - on command line, if gen/ directory does have '/', it does not get created \r
99 [DONE] ** FIX ** allow no namespace as a value in an xml definition file\r
100 [DONE] ** FIX ** look for i) velocity properties ii) velocity files in jar as well as classpath\r
101 [DONE] make interfaces for generated code \r
102     [DONE] turn Balloon into an interface and implementations that write 'classes' and 'interfaces'\r
103 [DONE] make "release" jar of Bob\r
104     [DONE] list jar dependencies \r
105     [DONE] include usage\r
106     [DONE] include competing products\r
108     - bob.jar\r
109     - bob-src.jar\r
110     - anonymous CVS\r
112     [DONE] arch doc\r
113     [DONE] API doc\r
114     [DONE] usage doc\r
115     \r
116     --> [DONE] ( as well as: Skype ) Bob, Keith, Young, Mike B., J.B. Rainsberger\r
117 [DONE] put 'make()' into the 'IBob' interface\r
118 [DONE] put 'make()' into each 'Bob' object\r
119     - insert into object...\r
120         i) namespace \r
121         ii) namespaces \r
122         iii) tagname \r
123         iv) attributes\r
124 [DONE] rework the semantics of FindFiles from...\r
125     1. list\r
126     2. suffix\r
127     3. directory, suffix\r
128     4. a specific file\r
129 [DONE] cleaner way to handle workflow of multiple callbacks\r
130 [DONE] (way of) instantiating 1) children 2) attributes in constructors\r
131     -> rework XMLHandler.endElement\r
132     \r
133     [DONE] put '_genChildren' into '_allChildren' -> implement in 'gen' classes\r
134         - use in toXML()\r
135     [DONE] include 'removeAll()' method on 'gen' objects\r
136 [DONE] fix 'ToXMLVisitorPass1.visitStart()'; use 'object.equals()' in (TreeSet)children to compare bob objects\r
137     --> changed Bob._children from TreeSet to List\r
138     --> create _attributes = new AttributesImpl()\r
139 [DONE] Test - BobComparator.java\r
140 [DONE] Test - Balloon.java\r
141 [DONE] Test - processing multiple files\r
142 [DONE] Test - allow no namespace as a value in an xml definition file\r
143 [DONE] 'gen' make()\r
144 [TEST]\r
145     [DONE] TagMerger.java\r
146     [DONE] DocumentHandler.java\r
147         [DONE] DefinitionHandler\r
148             [?] endHandle; don't know how to test this\r
149         [DONE] XMLHandler.java \r
150             [DONE] test for gen/ '/' weirdness; \r
151                 (if gen/ directory does have '/', it does not get created)\r
152             [?] endHandle; don't know how to test this\r
153     [DONE] look for i) velocity properties ii) velocity files in jar as well as classpath\r
154 [DONE] make a proper name for 'DocumentHandler2'\r
156 [DONE] [Naming mismatch xml/java]\r
157     --> if attributes have dashes in names (Java members cannot have dashes in names)\r
158     - remove dashes\r
159     - include dashes in name when writing toXML()\r
160     ** if the dash is removed in the definition, the definition must also \r
161     remember them. When writing out to XML, generated 'bob' classes must\r
162     refer to thier definitions to get the correct attribute name\r
164     TOUCH:\r
165     DefinitionHandler:\r
166         65         tagDef.setAttributes(attribs);\r
167         \r
168     ToXMLVisitorPass1:\r
169         97         aname = attrs.getLocalName(i);\r
171 [DONE] BobSystem; incl. endExecute callback on DocumentProcessor\r
172 [DONE] write out attribute names in java -> for toXML\r
174 [DONE] TESTS for generated classes\r
175     [DONE] accesors\r
176     \r
177     [DONE] adder\r
178     [DONE] all\r
179     \r
180     [DONE] finder\r
181     [DONE] remover\r
182     [DONE] removeall\r
183     \r
184     [DONE] visitor\r
185     [DONE] toXML\r
187 [DONE] 'run-gen' ant target only if 'gen' directory has not been created.\r
188 [DONE] [PERSISTENCE]\r
189 [DONE] generate bob structure from a string of <xml/>\r
190     [X] look at: JDO, Hibernate\r
191         -> see persistence scheme in 'bookkeeping'\r
192 [DONE] ISSUE - ant 'run-gen' breaks with error in 'error.run-gen'; the target is inserting weird characters somewhere in the files\r
194 [DONE] ANT - fix classpath referencing\r
197 [DONE] load BobSystem from <xml/>\r
198     [DONE] load 'n' xmls into BobSystem\r
199     [DONE] diff channels for i) definitions ii) xml system files\r
202 [DONE] remove dashes in tag names\r
204 [DONE] Separate xml files for -def and -sys\r
205 [DONE] any 'Bob' object can load xml content\r
206         -- load from \r
207         [DONE] String\r
208         [DONE] File\r
209         [DONE] InputStream\r
211 [DONE] common 'Attributes' interface; R/W attributes\r
213 [DONE] finish 'bootstrap' / 'core' code; change name to 'bob.system.xml'\r
214         [OK] make Bob use the <xmlProcessor><queue/></xmlProcessor> framework \r
215         [OK] Queue / DocumentProcessor code\r
216                 - IBob objects should \r
217                         [x] independently load definitions once \r
218                         [OK] independently load xml given file properties \r
220 [DONE] find[Tag]By[Name] only returns 1 result; doesn't handle case where several nodes meet the criteria\r
221         --> this is now handled by the 'listTagByAttribute' methods\r
224 [DONE] TESTING **\r
225     Queue.messageHistory()\r
226     BobHandler\r
228 [DONE] CLEANUP **\r
229         hardcoded file paths\r
231 [DONE] IBob.make(ns,tag)\r
233 [DONE] generate 'add{GenChildren}' / 'all{GenChildren}' if there are no attributes to 'find' & 'remove' them\r
236 [DONE] REFACTOR / specify toXML() depth, and inline  \r
237     [X] 'find(tag,attr)'; update finder interface - Class casting requires separate find methods\r
238     [X] 'remove(tag,attr)'\r
239     [X] 'removeAll(tag)'\r
240     [X] 'add(tag)'\r
241         \r
242     'toXML()'; update toXML interface to \r
243     [DONE] specify depth \r
244         [DONE] write XML prefix. the design goal here is \r
245                 \r
246                 1) to know the namespace of a tag and whether that namespace is local or from an ancestor \r
247                         >>> XMLHandler will write out NS information; \r
248                         >>> BobHandler will handle \r
249                                 i) whether namespace is 'visible' \r
250                                 ii) whether namespace is 'prefixed'; \r
251                                 iii) if prefixed, reverse-lookup the prefix name mapping \r
252                 \r
253                 2) to know whether to write the namespace or not (implicit from ancestor). If we write the namespace, should we \r
254                         i. write the namespace prefix or \r
255                         ii. write the namespace attribute, \r
256                         iii. from which namespace mapping \r
257                 * 'startPrefixMapping' is called immediately before the 'startElement' event \r
258                 \r
259                 \r
260                 **) in order to know whether to use a namespace PREFIX, each Bob should know \r
261         - its 'namespace'                                       >>> Gen.java > public final Sring NS = "my.namespace"; \r
262                 - its ancestor's 'namespace'            >>> (genObj.getParent()).NS; \r
263                 \r
264                 - its 'namespace' mappings                              >>> genObj._namespaceMap\r
265                 - its ancestor's 'namespace' mappings   >>> (genObj.getParent())._namespaceMap;\r
266                 \r
267                 - if 'prefixed'                                                 >>> genObj.isNSPrefixed() / genObj.setNSPrefixed(boolean p); \r
268                 - if namespace is written                               >>> genObj.isNSVisible() / genObj.setNSVisible(boolean v); \r
269                         - startPrefixMapping has a prefix\r
270                         - there is an 'xmlns' attribute \r
271                         \r
272                         \r
273 Write the tests using 'test1.xml'. The goal will be to read, then write out exactly the same XML complete with namespacing. When a new Bob child object is added to the Java tree, the default behaviour will be to \r
274         i) leave ns blank if ns matches ancestor \r
275         ii) write prefix if ns is  different from ancestor and prefx mapping is available \r
276         iii) write ns attribute otherwise. \r
278 <ancestor id="ancestorid" name="" address=""\r
279     xmlns="com/interrupt/"\r
280     xmlns:one="com/interrupt/one"\r
281     xmlns:two="com/interrupt/two">\r
282     \r
283     \r
284     <parent id="parentid" name="pname" address="paddress">\r
285                 \r
286                 <one:thing id="thingid" name="tname" xmlns:deux="com/interrupt/deux">\r
287                 \r
288                 This is some information about 'thing'.\r
289                 \r
290                 <wee id="weeid"/>\r
291                 <two:waa id="waaid"/>\r
292                         \r
293         </one:thing>\r
294     </parent>\r
295 </ancestor>\r
296 fig. 1 \r
298 DONE 1) <wee/> \r
299         - namespace 'com/interrupt/', comes from ancestor\r
300         - is NOT prefixed \r
301         - parent's namespace is different and prefixed \r
303 DONE 2) <thing/>\r
304         - is prefixed \r
305         - namespace mapping comes from ancestor mappings \r